HDU 3873 Invade the Mars(带限制条件的Dijkstra)
题目网址: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)的更多相关文章
- hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)
Invade the Mars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 365768/165536 K (Java/Others ...
- POJ 1062 昂贵的聘礼(带限制条件的dijkstra)
题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- HDU 5188 zhx and contest(带限制条件的 01背包)
Problem Description As one of the most powerful brushes in the world, zhx usually takes part in all ...
- HDU 3047 Zjnu Stadium(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...
- HDU(1856),裸的带权并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:朋友圈问题,A和B是朋友,B和C是朋友则A和C也是朋友,依次类推,题目的意思就是求最大的朋 ...
- hdu 3074 Zjnu Stadium (带权并查集)
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
- HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp
题意: 给定n deep 1.构造一个n个节点的带权树,且最大深度为deep,每一个节点最多仅仅能有2个儿子 2.每一个节点的值为2^0, 2^1 ··· 2^(n-1) 随意两个节点值不能同样 3 ...
- HDU 3635 Dragon Balls(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3635 题意: 有n颗龙珠和n座城市,一开始第i颗龙珠就位于第i座城市,现在有2种操作,第一种操作是将x龙珠所在城 ...
随机推荐
- Python基础(十)
今日主要内容 补充:传参与参数分配区别 动态传参 函数注释 名称空间 函数名的使用 函数嵌套 global和nonlocal 补充:传参与参数分配区分 先看一个函数定义和函数调用 def func(a ...
- ckeditor中 config.js等通过ckeditor.js引入文件手动修改方法
因为除了ckeditor.js之外的引用文件是通过ckeditor.js自动添加<script>或<link>标签实现文件的引入,引入的根目录是展示页面的地址.有时需要手动修改 ...
- 在.NET Core中使用DispatchProxy“实现”非公开的接口
原文地址:"Implementing" a non-public interface in .NET Core with DispatchProxy 原文作者:Filip W. 译 ...
- html中的空格
网上摘录: HTML提供了6种空格实体.除第一种外,其他几种空格在不同浏览器中宽度各异. 它叫不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格, ...
- 使用Git工具批量拉取代码
公司项目比较多,每天上班第一件事就是拉取代码,cd A 目录 git pull cd .. cd B ...... 一个项目一个项目的拉取,感觉也是很费劲的,那么有没有什么一键操作呢 现在执行一个命令 ...
- 如何判断前后端bug
测试工程师不只是负责发现问题,除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产品的流程.开发方案.开发人员 ...
- 从SpringMVC获取用户信息谈起
Github地址:https://github.com/andyslin/spring-ext 编译.运行环境:JDK 8 + Maven 3 + IDEA + Lombok spring-boot: ...
- 【ADO.NET基础知识】SqlConnection、command、DataSet 、DataTable、dataAdapter
1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: ...
- 纯 CSS 实现幻灯片播放
介绍: 今日看到一道面试题,关于 使用纯CSS,不利用js, 写一个简单的幻灯效果页面.于是做了一个小demo,建议使用chrome,IE11查看~~ 主要思想: 利用 CSS3的 伪类选择器 : ...
- 品Spring:真没想到,三十步才能完成一个bean实例的创建
在容器启动快完成时,会把所有的单例bean进行实例化,也可以叫做预先实例化. 这样做的好处之一是,可以及早地发现问题,及早的抛出异常,及早地解决掉. 本文就来看下整个的实例化过程.其实还是比较繁琐的. ...