Wormholes(POJ 3259)
2016-04-21 10:19
302 查看
Wormholes
Time Limit:2000MS Memory Limit:65536KB 64bit
IO Format:%I64d & %I64u
Description
While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole!
Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.
As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet
himself :) .
To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back
in time by more than 10,000 seconds.
Input
Line 1: A single integer, F. F farm descriptions
follow.
Line 1 of each farm: Three space-separated integers respectively: N, M,
and W
Lines 2.. M+1 of each farm: Three space-separated numbers ( S, E, T)
that describe, respectively: a bidirectional path between S and E that requires T seconds
to traverse. Two fields might be connected by more than one path.
Lines M+2.. M+ W+1
of each farm: Three space-separated numbers ( S, E, T)
that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.
Output
Lines 1.. F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).
Sample Input
Sample Output
Hint
For farm 1, FJ cannot travel back in time.
For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this
题意:John在农场里探索,发现每个农场包括n块田地,m条双向路径以及w个单向虫洞。他想知道他从任意一块田地出发,能否再回到出发点。
分析:可以将题抽象成有n个顶点,m条双向边(权值为t)和w条单向边(权值为-t)。判断是否存在负环。用Bellman-Ford算法判断是否存在负环,如果不存在,则迭代n次后可求得其最短路;否则,最短路不存在(沿着负环一直走,路会更短)
Time Limit:2000MS Memory Limit:65536KB 64bit
IO Format:%I64d & %I64u
Description
While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole!
Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.
As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet
himself :) .
To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back
in time by more than 10,000 seconds.
Input
Line 1: A single integer, F. F farm descriptions
follow.
Line 1 of each farm: Three space-separated integers respectively: N, M,
and W
Lines 2.. M+1 of each farm: Three space-separated numbers ( S, E, T)
that describe, respectively: a bidirectional path between S and E that requires T seconds
to traverse. Two fields might be connected by more than one path.
Lines M+2.. M+ W+1
of each farm: Three space-separated numbers ( S, E, T)
that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.
Output
Lines 1.. F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).
Sample Input
23 3 11 2 22 3 11 3 43 1 3 2 3 43 2 1 1 2 3 3 1 8
Sample Output
NOYES
Hint
For farm 1, FJ cannot travel back in time.
For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this
题意:John在农场里探索,发现每个农场包括n块田地,m条双向路径以及w个单向虫洞。他想知道他从任意一块田地出发,能否再回到出发点。
分析:可以将题抽象成有n个顶点,m条双向边(权值为t)和w条单向边(权值为-t)。判断是否存在负环。用Bellman-Ford算法判断是否存在负环,如果不存在,则迭代n次后可求得其最短路;否则,最短路不存在(沿着负环一直走,路会更短)
<pre name="code" class="cpp">#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 500 + 10; const int MAXM = 5000 + 1000; const int INF = 0x3f3f3f3f; int n,m,w,k; int f[MAXN]; //从顶点s指向顶点e的权值为t的边 struct farm { int s,e,t; }map[MAXM]; //记录一条从顶点x到顶点y权值为z的路径 void join(int x,int y,int z) { map[k].s = x; map[k].e = y; map[k].t = z; k++; } //如果返回1则存在负圈,否则不存在 int Bellman_Ford() { memset(f,INF,sizeof(f)); f[1] = 0; //求最短路 for(int i = 0;i < n;i++) { for(int j = 0;j < k;j++) { int u = map[j].s; int v = map[j].e; int w = map[j].t; if(f[u] + w < f[v]) f[v] = f[u] + w; } } for(int i = 0;i < n;i++) { for(int j = 0;j < k;j++) { int u = map[j].s; int v = map[j].e; int w = map[j].t; if(f[u] + w < f[v]) //若还能更新,则存在负圈 return 1; } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d %d",&n,&m,&w); int x,y,z; k = 0; for(int i = 0;i < m;i++) { scanf("%d %d %d",&x,&y,&z); join(x,y,z); join(y,x,z); } for(int i = 0;i < w;i++) { scanf("%d %d %d",&x,&y,&z); join(x,y,-z); } if(Bellman_Ford()) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- c++第4次实验-输出星号图
- 第九章 springboot + mybatis + 多数据源 (AOP实现)
- 概率统计 分布
- Oracle字符集和国家字符集
- Android事件分发机制(二)
- test
- 如何处理服务器SSL收到了一个弱临时Diffie-Hellman 密钥?
- 抽象类与接口的区别及应用
- makefile 编写规则
- 使用Yeoman搭建 AngularJS 应用 (7) —— 让我们搭建一个网页应用
- 苏州Uber优步司机奖励政策(4月21日)
- 第一章 AOP
- Understanding and Using HRMS Security in Oracle HRMS
- redis实战
- redis实战
- redis实战
- redis实战
- redis实战
- jquery多属性选择器
- 如何将 UbuntuServer 安全的升级