题目网址: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 ;
}

最新文章

  1. Recurrent Neural Network系列1--RNN(循环神经网络)概述
  2. ASP.NET的六大内置对象
  3. weblogic 12c web部署注意的问题
  4. ZooKeeper:Quick Start
  5. AngularJS之directive
  6. python模块及包的导入
  7. JS/PHP 浮点数精确运算
  8. iOS 发布遇到的问题 (转载)
  9. Python中的属性管理
  10. 【设计模式】常用de单例模式
  11. 学会使用git
  12. 一行一行分析JQ源码学习笔记-06
  13. DirectFB、Layer、Window、Surface之间关系
  14. React + Redux + express+ antd 架构的认识
  15. BigDecimal精确计算及陷阱
  16. MicroPython之TPYBoard v102开发板控制OLED显示中文
  17. Shell Necklace (dp递推改cdq分治 + fft)
  18. AngularJs指令配置参数scope详解
  19. linux下删除大量文件提示参数过长解决办法
  20. 三个php加密解密算法

热门文章

  1. 松软带你学开发-SQLSELECTDISTINCT语句
  2. 基于GitHub Issues的评论系统--gitment
  3. charles 代理设置
  4. charles 访问控制设置
  5. WebApi简介
  6. 从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书
  7. 阿里云ecs安全组端口开放设置
  8. java8 运算语法集
  9. Centeos7搭建selenium+Chrome浏览器
  10. Linux上编译安装PHP