POJ-3259 Wormholes(负权回路[Bellman-Ford])
2016-05-07 11:42
387 查看
Wormholes
http://poj.org/problem?id=3259
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.
题目大意:判断是否存在负权回路?
只以1号点为源点做Bellman-Ford即可判断图中是否存在负权回路(该负权回路不一定以1号点为起点)
例如:
1
3 0 2
2 3 1
3 2 1
这组数据会输出YES
调试时能发现,dis[2],dis[3]每次都在更新,但是是在INF的基础上更新,所以要判断1号点是否可打2,3时,要判断dis[2],dis[3]是否 大于 图中的最大权值和才行
http://poj.org/problem?id=3259
Time Limit: 2000MS | Memory Limit: 65536K | |
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
2 3 3 1 1 2 2 1 3 4 2 3 1 3 1 3 3 2 1 1 2 3 2 3 4 3 1 8
Sample Output
NO YES
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.
题目大意:判断是否存在负权回路?
只以1号点为源点做Bellman-Ford即可判断图中是否存在负权回路(该负权回路不一定以1号点为起点)
例如:
1
3 0 2
2 3 1
3 2 1
这组数据会输出YES
调试时能发现,dis[2],dis[3]每次都在更新,但是是在INF的基础上更新,所以要判断1号点是否可打2,3时,要判断dis[2],dis[3]是否 大于 图中的最大权值和才行
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int MAXN=505; const int INF=0x3f3f3f3f; struct Edge { int s,e,v; Edge(int ss=0,int ee=0,int vv=0):s(ss),e(ee),v(vv) {} }u; int n,m,w,s,e,v; vector<Edge> edge; int dis[MAXN]; bool Bellman_Ford(int sta) {//可判断负权回路 bool relaxed; memset(dis,0x3f,sizeof(dis)); dis[sta]=0; for(int i=1;i<n;++i) { relaxed=false; for(int j=0;j<edge.size();++j) { if(dis[edge[j].s]+edge[j].v<dis[edge[j].e]) {//松弛 dis[edge[j].e]=dis[edge[j].s]+edge[j].v; relaxed=true; } } if(!relaxed) {//如果未更新,则不会再更新,且无负权回路 return false; } } for(int j=0;j<edge.size();++j) { if(dis[edge[j].s]+edge[j].v<dis[edge[j].e]) {//如果可以继续松弛,则存在负权回路 return true; } } return false; } int main() { int F; scanf("%d",&F); while(F-->0) { edge.clear(); scanf("%d%d%d",&n,&m,&w); for(int i=1;i<=m;++i) { scanf("%d%d%d",&s,&e,&v); edge.push_back(Edge(s,e,v)); edge.push_back(Edge(e,s,v)); } for(int i=1;i<=w;++i) { scanf("%d%d%d",&s,&e,&v); edge.push_back(Edge(s,e,-v)); } printf("%s\n",Bellman_Ford(1)?"YES":"NO"); } return 0; }
相关文章推荐
- h264 基础知识1
- 关于mysql链接错误的记录
- 【HUSTOJ】1090: 螺旋方阵
- Android网络通信之Socket
- B树的实现
- 杭电oj~~2006
- 内部排序(一)------插入排序、交换排序
- android关于轮询的一种解决方案
- 【bzoj1324】Exca王者之剑(8-9 方格取数问题)
- 十分钟轻松让你认识ASP.NET MVC6
- Nginx的安装以及配置
- XIB、Storyboard操作小技巧
- hdu4286
- 第一回使用Android Studio时你应该知道的一切配置
- 毕设笔记--CSS样式修改
- CodeForces 670D2 Magic Powder - 2
- 动态获得类的属性来构建模型
- 3.26日第六次作业,第10章质量,11章人力
- 未将对象引用设置到对象的实例
- Python数据分析示例(2)Day3