poj 3259 bellman最短路判断有无负权回路
来源:互联网 发布:java 高级编程 书籍 编辑:程序博客网 时间:2024/06/05 08:47
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 toF (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 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 toE that also moves the traveler back T seconds.
Output
Sample Input
23 3 11 2 21 3 42 3 13 1 33 2 11 2 32 3 43 1 8
Sample Output
NOYES
Hint
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.
Source
70ms
#include<iostream> //79ms#include<cstdio>#include<cstring>#include<cmath>#define INF 10000000using namespace std;struct node{ int u,v,w;} edge[5500];int low[5500];int n,m,z;int num=0;int Bellman(){ for(int i=0; i<=n; i++) low[i]=INF; for(int i=0; i<n-1; i++) { int flag=0; for(int j=0; j<num; j++) { if(low[edge[j].u]+edge[j].w<low[edge[j].v]) { low[edge[j].v]=low[edge[j].u]+edge[j].w; flag=1; } } if(flag==0) //存在负权回路 break; } for(int j=0; j<num; j++) //判断负权回路 { if(low[edge[j].u]+edge[j].w<low[edge[j].v]) return 1; } return 0;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&z); int a,b,c; num=0; for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); edge[num].u=a; edge[num].v=b; edge[num++].w=c; edge[num].u=b; edge[num].v=a; edge[num++].w=c; } for(int i=1; i<=z; i++) { scanf("%d%d%d",&a,&b,&c); edge[num].u=a; edge[num].v=b; edge[num++].w=-c; } if(Bellman()) printf("YES\n"); else printf("NO\n"); }}
700ms
#include<iostream> //挨个点遍历#include<cstdio>#include<cstring>#include<cmath>#define INF 0x3f3f3f3fusing namespace std;struct node{ int u,v,w;} edge[5500];int low[550];int n,m,z;int num=0;int Bellman(int u0){ for(int i=0; i<=n; i++) low[i]=INF; low[u0]=0; for(int i=0; i<n; i++) //递推n次,让其构成环来判断 { int flag=0; for(int j=0; j<num; j++) { if(low[edge[j].u]!=INF&&low[edge[j].u]+edge[j].w<low[edge[j].v]) { low[edge[j].v]=low[edge[j].u]+edge[j].w; flag=1; } } if(flag==0) //存在负权回路(减少时间) break; } if(low[u0]<0)return 1; return 0;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&z); int a,b,c; num=0; for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); edge[num].u=a; edge[num].v=b; edge[num++].w=c; edge[num].u=b; edge[num].v=a; edge[num++].w=c; } for(int i=1; i<=z; i++) { scanf("%d%d%d",&a,&b,&c); edge[num].u=a; edge[num].v=b; edge[num++].w=-c; } int biao=1; for(int i=1; i<=n; i++) { if(Bellman(i)) { printf("YES\n"); biao=0; break; } } if(biao) printf("NO\n"); }}/*780ms#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define INF 0x3f3f3f3fusing namespace std;struct node{ int u,v,w;} edge[5500];int low[5500];int n,m,z;int num=0;int Bellman(int u0){ for(int i=0; i<=n; i++) low[i]=INF; low[u0]=0; //初始化 for(int i=0; i<n-1; i++) //n-1次 { int flag=0; for(int j=0; j<num; j++) { if(low[edge[j].u]!=INF&&low[edge[j].u]+edge[j].w<low[edge[j].v]) //不同点 { //存在low[edge[j].u]!=INF,就必须有low[u0]=0;初始化 low[edge[j].v]=low[edge[j].u]+edge[j].w; flag=1; } } if(flag==0) //存在负权回路 break; } for(int j=0; j<num; j++) { if(low[edge[j].u]!=INF&&low[edge[j].u]+edge[j].w<low[edge[j].v]) return 1; } return 0;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&z); int a,b,c; num=0; for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); edge[num].u=a; edge[num].v=b; edge[num++].w=c; edge[num].u=b; edge[num].v=a; edge[num++].w=c; } for(int i=1; i<=z; i++) { scanf("%d%d%d",&a,&b,&c); edge[num].u=a; edge[num].v=b; edge[num++].w=-c; } int biao=1; for(int i=1; i<=n; i++) { if(Bellman(i)) { printf("YES\n"); biao=0; break; } } if(biao) printf("NO\n"); }}*/
- poj 3259 bellman最短路判断有无负权回路
- poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)
- poj 3259 Wormholes (SPFA 判断有无负权回路)
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,判断是否存在负权回路)
- POJ 3259 Wormholes(判断负权回路|SPFA||Bellman-Ford)
- poj 3259 bellman-ford判断是否存在负权回路
- poj 3259 负权回路+Bellman
- bellman-ford算法——最短路问题,判断是否存在负权回路或正权回路
- bellman-ford算法——最短路问题,判断是否存在负权回路或正权回路
- POJ 1860 Bellman-frod判断负权回路
- POJ 3259 Wormholes(最短路,判断有没有负环回路)
- poj 3259 bellman-ford算法 判断是否存在负权回路
- PKU 3259 Wormholes - 判断负权回路 Bellman-Ford
- 最短路(SPFA+负权回路的判断)-poj3268
- Bellman-Ford算法判断负权回路
- bellman判断负权回路--poj3259
- Bellman-For判断负权回路
- poj 3259 Wormholes(最短路+spfa+判负回路)
- day22
- [TOJ 1965] Gnome Tetravex
- intelliJ一键部署远程tomcat
- iOS项目开发实战——实现视图切换动画
- Codeforces 455B
- poj 3259 bellman最短路判断有无负权回路
- 排序算法和查询算法的介绍
- hdoj 1905 Pseudoprime numbers
- 简单工厂,工厂模式和抽象工厂模式
- C++中虚函数和非虚函数重载在继承时的区别
- dialog相关
- oracle 异常关闭造成 -重启服务仍无法正常连接 -windows处理
- SVN提交.a文件
- Spring 入门教程(三) 注入和自动装配