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 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
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
最短路径问题,判断是否含有负权值,
题意:虫洞,xx想看看是否能够通过虫洞回到原来位置看到原来的自己
(虫洞可以将人从一个地方送达到另一个地方,且可以让时间倒退t秒)
就模板套用 判断是否含有负权回路。。
#include <iostream> #include <cstdio> using namespace std; const int maxn=5555; const int inf=9999999; struct edge { int s,e; int ss; }g[maxn]; int n,m,hole,i,j; int g_m;//存储g[]的大小 int start,endd; int dis[maxn]; bool bellman_ford(int x)//从1-n,x为起点 { int s,e,ss; bool flag; for(i=1;i<=n;i++) dis[i]=inf; dis[x]=0; for(i=1;i<=n;i++)//dis数组更新操作 { flag=false; for(j=0;j<g_m;j++) { s=g[j].s; e=g[j].e; ss=g[j].ss; if(dis[e]>dis[s]+ss)//松弛迭代过程 { dis[e]=dis[s]+ss; flag=true; } } if(flag==false)//不再有更新,直接跳出 break; } for(j=0;j<g_m;j++)//判断是否含有负权环 { s=g[j].s; e=g[j].e; ss=g[j].ss; if(dis[e]>dis[s]+ss) return false; } return true; } int main() { int s,e,ss; int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&hole); g_m=0; for(i=0;i<m;i++) { scanf("%d%d%d",&s,&e,&ss); g[g_m].s=s; g[g_m].e=e; g[g_m++].ss=ss;//双向,分开存 g[g_m].s=e; g[g_m].e=s; g[g_m++].ss=ss; } for(i=0;i<hole;i++) { scanf("%d%d%d",&s,&e,&ss); g[g_m].s=s; g[g_m].e=e; g[g_m++].ss=-ss; } if(!bellman_ford(1)) printf("YES\n"); else printf("NO\n"); } return 0; }