题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3873

思路:

军队可以先等待在城市外面,等保护该城市的城市都被攻破后,直接进城(即进城不用耗费时间)。则进入该城市的最少时间为max(达到该城市的最少时间,到达保护该城市的所有城市的最大时间)。

用num[i]标记第i个城市被保护的数目,只有当该点被保护的数目为0时,才能入S集合,从而优化到其他点的时间。当前进入S集合的城市,遍历它所保护的城市,num[i]减一,记录下被保护的城市解除保护所需的最长时间。

说的有点绕,看代码会比较清楚。

需要注意的一点!!有重边,所以读边的时候要注意,如果是用邻接表就无所谓啦,但如果是用邻接矩阵 要读入最小值。

代码:

 #include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf=1e8+;
int n,m;
int num[];
int dist[];
int S[];
int edge[][];
int rp[];//rp[i]表示攻破保护i城市的所有城市所需要的最长时间
vector<int>city[];
void init(){
memset(num, , sizeof(num));
memset(rp, , sizeof(rp));
memset(S, , sizeof(S));
for (int i=; i<=n; i++) {
city[i].clear();
dist[i]=inf;
}
for (int i=; i<=n; i++) {
for (int j=; j<=n; j++) {
edge[i][j]=inf;
}
}
}
void dijkstra(){
dist[]=;
for(int i=;i<n;i++){
int Min=inf,u=-;
for (int j=; j<=n; j++) {
dist[j]=max(dist[j], rp[j]);//每次遍历前 都要更新时间
if(dist[j]<Min && !num[j] && !S[j]){
Min=dist[j];
u=j;
}
}
if(u==-) return ;
S[u]=;
for (int j=; j<city[u].size(); j++) {//更新保护的城市信息
int t=city[u][j];
num[t]--;
rp[t]=max(rp[t],dist[u]);
}
city[u].clear();
for (int j=; j<=n; j++) {
if(dist[j]>dist[u]+edge[u][j] && !S[j]){
dist[j]=dist[u]+edge[u][j];
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while (t--) {
scanf("%d%d",&n,&m);
init();
for(int i=;i<m;i++){
int v,u,w;
scanf("%d%d%d",&v,&u,&w);
edge[v][u]=min(edge[v][u],w);//保留最小值 }
for(int i=;i<=n;i++){
int a,b;
scanf("%d",&a);
num[i]=a;//记录保护i城市的所有城市数量
for (int j=; j<a; j++) {
scanf("%d",&b);
city[b].push_back(i);//city[b]为b城市 要保护的城市
}
}
dijkstra();
printf("%d\n",dist[n]);
}
return ;
}

HDU 3873 Invade the Mars(带限制条件的Dijkstra)的更多相关文章

  1. hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)

    Invade the Mars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 365768/165536 K (Java/Others ...

  2. POJ 1062 昂贵的聘礼(带限制条件的dijkstra)

    题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  3. HDU 5188 zhx and contest(带限制条件的 01背包)

    Problem Description As one of the most powerful brushes in the world, zhx usually takes part in all ...

  4. HDU 3047 Zjnu Stadium(带权并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...

  5. HDU(1856),裸的带权并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:朋友圈问题,A和B是朋友,B和C是朋友则A和C也是朋友,依次类推,题目的意思就是求最大的朋 ...

  6. hdu 3074 Zjnu Stadium (带权并查集)

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. hdu 3790 最短路径问题(两个限制条件的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...

  8. HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp

    题意: 给定n deep 1.构造一个n个节点的带权树,且最大深度为deep,每一个节点最多仅仅能有2个儿子 2.每一个节点的值为2^0, 2^1 ··· 2^(n-1)  随意两个节点值不能同样 3 ...

  9. HDU 3635 Dragon Balls(带权并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3635 题意: 有n颗龙珠和n座城市,一开始第i颗龙珠就位于第i座城市,现在有2种操作,第一种操作是将x龙珠所在城 ...

随机推荐

  1. 亮剑.NET学习札记

    学习前提要: 因为书的版本过老,有些章节不学了,要学的包括以下章节 暂定:1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,附录A 第一章:主要是介绍.NET,包括面向 ...

  2. 004:CSS三大重点之二:浮动(拖标、不占位置、转行内块)

    目录 1:拖标.不占位.转行内块 2:首先浮动的盒子需要和标准流的父级搭配使用,其次 特别的注意浮动可以使元素显示模式体现为行内块特性. 3:清除浮动 前言 CSS的定位机制有3种:普通流(标准流). ...

  3. JS基础-全方面掌握继承

    前言 上篇文章详细解析了原型.原型链的相关知识点,这篇文章讲的是和原型链有密切关联的继承,它是前端基础中很重要的一个知识点,它对于代码复用来说非常有用,本篇将详细解析JS中的各种继承方式和优缺点进行, ...

  4. [Linux] Telnet提示:Unable to connect to remote host: No route to host

    出错现象: [root@localhost ~]# telnet 192.168.1.128 Trying 192.168.1.128...telnet: connect to address 192 ...

  5. Mach-O在内存中符号表地址、字符串表地址的计算

    KSCrash 是一个用于 iOS 平台的崩溃捕捉框架,最近读了其部分源码,在 KSDynamicLinker 文件中有一个函数,代码如下: /** Get the segment base addr ...

  6. 关于canvas合成分享图

    最近在uni-app项目中遇到一个合成分享图的需求,其实最开始是用原生写法来做的,后台发现在PC端测试是可以的,但在APP模拟器中会出现问题,可能是因为两者的js环境不同吧,uni-app官网也说了这 ...

  7. 远古框架-SSH maven配置 (包含gson)

    Spring3.2.17+Struts2.3.15+Hibernate3.6.10 <?xml version="1.0" encoding="UTF-8" ...

  8. 大文件分割、命令脚本 - Python

    日志文件分割.命名 工作中经常会收到测试同学.客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针 ...

  9. python 课后习题 猜数游戏

    4.1 猜数游戏.在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜数字,如果大于预设的数,显示“遗憾,太大了”:如果小于预设的数,显示“遗憾,太小了”:如此循环,直至猜到该数,显示“预测N次, ...

  10. CentOS 8 正式发布

    转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net] 本文地址:https://www.oschina.net/news/110111/centos-8-re ...