hdu3873 有约束条件的最短路
题目大意:美国佬打算入侵火星,火星上有n个城市,有些城市可能受其他城市保护,
如果i城市受j城市保护,那么你必须先攻占j城市才能再攻占i城市,问你攻占城市n的最短时间是多少。
数据解释:
给定t, 表示有t组数据
给定n,m 表示n个点,m条边
接下来m条有向边, a,b,c 表示从a到b,距离为c
接下来n行, 每行第一个整数d,然后接下来是d个整数,x1,x2,...xd, 表示第i个城市受d个城市保护,表示只有城市x1,x2...xd都被攻占,城市i才能被攻占
问从点1到达点n的最短时间(一定是可达的)
重要的一点是,因为是军队,所以可以同时进军多个点。
思路:
如果城市i受其他城市保护, 那么攻占城市i的最短时间是从1-->i和攻占城市i的保护城市 这两个时间中的最大值。
设dist[i] 为 攻占城市i的最短时间, maxn[i] 为攻占所有保护i的城市中时间最长的那个
那么 dist[i] = max(dist[i],maxn[i])
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
typedef long long LL;
const int INF = << ;
/* */
struct Edge
{
int to, dist;
bool operator<(const Edge&rhs)const
{
return dist > rhs.dist;
}
};
vector<Edge> g[ + ];
vector<int> pro[ + ];
bool vis[ + ];
int protect[ + ];
int dist[ + ], maxn[ + ], ans[ + ];
void dij(int n)
{
for (int i = ; i <= n; ++i)
{
vis[i] = false;
dist[i] = INF;
maxn[i] = ;
}
dist[] = ;
priority_queue<Edge> q;
Edge cur, tmp;
cur.to = ;
cur.dist = ;
q.push(cur);
while (!q.empty())
{
cur = q.top(); q.pop();
int x = cur.to;
if (vis[x]) continue;
for (int i = ; i < pro[x].size(); ++i)
{
int v = pro[x][i];
maxn[v] = max(maxn[v], dist[x]);//求出到达保护城市v的城市最长的那一个
protect[v]--;
}
vis[x] = true;
for (int i = ; i < g[x].size(); ++i)
{
int v = g[x][i].to;
if (dist[v] > dist[x] + g[x][i].dist)
dist[v] = dist[x] + g[x][i].dist;
}
for (int i = ; i <= n; ++i)
{
if (vis[i]) continue;
dist[i] = max(dist[i], maxn[i]);
if (protect[i] == && dist[i]!=INF)//在点i没有解除约束之前,我们不能让它去更新其它的点
{
tmp.to = i;
tmp.dist = dist[i];
q.push(tmp);
} }
}
} void input(int &x)
{
char ch = getchar();
while (ch > '' || ch < '')
ch = getchar();
x = ;
while (ch >= '' && ch <= '')
{
x = x * + ch - '';
ch = getchar();
}
}
int main()
{
int t, n, m, i, a, b, c;
Edge tmp;
scanf("%d", &t);
while (t--)
{
//scanf("%d%d", &n, &m);
input(n); input(m);
for (i = ; i <= n; ++i)
{
g[i].clear();
pro[i].clear();
}
for (i = ; i < m; ++i)
{
//scanf("%d%d%d", &a, &b, &c);
input(a); input(b); input(c);
tmp.to = b;
tmp.dist = c;
g[a].push_back(tmp);
}
for (int i = ; i <= n; ++i)
{
//scanf("%d", &a);
input(a);
protect[i] = a;
for (int j = ; j < a; ++j)
{
//scanf("%d", &b);
input(b);
pro[b].push_back(i);
}
}
dij(n);
printf("%d\n", dist[n]);
}
return ;
}
hdu3873 有约束条件的最短路的更多相关文章
- poj 1724 最短路+优先队列(两个约束条件)
/*两个约束条件求最短路,用优先队列*/ #include<stdio.h> #include<string.h> #include<queue> using na ...
- hdu3873 Invade the Mars 有限制的最短路
此段略过.看完题目,觉得这真的是一道好题目.自己有想法,但是实现起来却很难.看题解,写代码,然后写题解,意义何在?我不认为自己总是这么弱.就算抄代码,我也要有自己的理解.菜鸟总会成长. 首先,题目必须 ...
- POJ 1201 Intervals (差分约束,最短路)
题意: 有一个集合Z,其元素都是整整数,但是数量未知.现有n个约束,形如 [a,b]=c 表示整数区间[a,b]中有c个元素在Z中出现.问集合Z最小可能含多少个元素? 思路: 对于所给的区间 cnt[ ...
- 【UVA11478】Halum (最短路解差分约束)
题目: Sample Input2 11 2 102 11 2 -103 31 2 42 3 23 1 54 52 3 44 2 53 4 23 1 01 2 -1Sample OutputInfin ...
- [HAOI2005]路由问题,第二短路
[问题描写叙述] X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径.遗憾的是.因为种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点 ...
- 【NOIP复习】最短路总结
[模板] /*堆优化Dijkstra*/ void dijkstra() { priority_queue<pair<ll,int>,vector<pair<ll,int ...
- HAOI 2005 路由选择问题 (最短路+次短路)
问题描述 X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径.遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点. 任务一:在己 ...
- 培训补坑(day1:最短路&two-sat)
经过12天的滚粗,终于迎来了暑期培训的结尾啦QAQ 结业考才考了90分,真是对不起孙爷(孙爷请收下我的膝盖) orz小粉兔怒D rank 1 获得小粉兔一只QAQ 由于这次12天的培训题目又比较多,算 ...
- 最短路 & 差分约束 总结
一.引例 1.一类不等式组的解 二.最短路 1.Dijkstra 2.图的存储 3.链式前向星 4.Dijkstra + 优先队列 ...
随机推荐
- SpringMVC批量上传
@RequestMapping(value = "/upload") public String handleFormUpload(MultipartHttpServletRequ ...
- POJ 2632 Crashing Robots(较为繁琐的模拟)
题目链接:http://poj.org/problem?id=2632 题目大意:题意简单,N个机器人在一个A*B的网格上运动,告诉你机器人的起始位置和对它的具体操作,输出结果: 1.Robot i ...
- address_space 从哪里来
address_space 从哪里来 这两天想弄清楚linux的内存分配,忽然看到了address_space,就想弄明白. 整个内核就见到 address_space(1)和address_spac ...
- C语言常用的宏
01: 防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类 ...
- MySQL HINT:Straight_JOIN
来自生产环境的朋友.可能都会碰到: 原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕 一个很大可能的原因就是数据分布情况发生了变化 从而导致MySQL优化 ...
- android设置中的Preferencescreen使用方法介绍与分析
今天主要研究了一下设置中的Preferencescreen应用,它不仅可以作为设置界面显示,并且还可以启动activity,以下主要是对启动activity的介绍 1. Preferencescree ...
- STL 源代码分析 算法 stl_algo.h -- includes
本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...
- ubuntu下海信Hisense E920 usb连接不上的处理与adb的连接
解决lssub未能发现海信Hisense USB设置:选择 天翼宽带连接 如下所示: luogw@luogw-ThinkPad-Edge:~$ lsusb Bus 001 Device 002: ID ...
- VS2008下OpenCV1.0的设置
原地址:http://hi.baidu.com/caicai_coco/item/0f3b23e1742e3f11595dd825 1.下载安装最新的OpenCV版本,我使用的是OpenCV_1.0. ...
- cmake编译时遇到的问题解决
编译cmake首先须要gcc环境,能够运行 gcc --version命令看看. 假设没有,能够使用yum或从cd中进行安装,此处是在虚拟机中从cd中进行安装.将cd链接到虚拟机都会吧,此处略去,.. ...