题目大意:农场上有N块田地(N < = 500),M条路径(M <= 2500)
可以从i到达j花费t单位时间。
另外还有W个虫洞(W <= 200),虫洞可以从一块地i到达另一块地j并且时间倒退t!
注意路径是双向的,虫洞是单向的。现在农夫John希望知道能否从某块地出发并且回到这块地,使得他回来的时间 早于 出发的时间(可以遇到他自己)。
/* 最短路 Bellman_Ford 求是否存在负权回路 */ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define N 6000 #define INF 0x7fffffff using namespace std; typedef struct { int u,v,w; } by; by b[N]; int n,m,w; int Bellman_Ford(int f) { int i,j,dis[N]; for(i=1; i<=n; i++) dis[i]=INF; dis[1]=0; for(i=1; i<n; i++) for(j=0; j<f; j++) if(dis[b[j].u]<INF&&dis[b[j].v]>dis[b[j].u]+b[j].w) dis[b[j].v]=dis[b[j].u]+b[j].w; for(i=0; i<f; i++) if(dis[b[i].v]>dis[b[i].u]+b[i].w) return 1; return 0; } int main() { int t,i; cin>>t; while(t--) { int f=0; int u1,v1,w1; cin>>n>>m>>w; for(i=0; i<=n; i++) b[i].u=b[i].v=b[i].w=INF; for(i=0; i<m; i++) { cin>>u1>>v1>>w1; b[f].u=b[f+1].v=u1; b[f].v=b[f+1].u=v1; b[f].w=b[f+1].w=w1; f+=2; } for(i=0; i<w; i++) { cin>>b[f].u>>b[f].v>>w1; b[f++].w=-w1; } int ans=Bellman_Ford(f); if(ans) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }