题意:F代表农场的个数,N代表每一个农场里的区域数,M代表连接任意两个区域的边数,W代表虫洞的数量。John喜欢时光旅行,在他的农场里有许多区域,区域之间被一些正权的边和一些负权的虫洞连接。判断John能否在区域之间实现时光旅行。
题解:即判断有无带负权的环存在。
#include<cstdio> #define INF 100000000 #define MAX 10000 struct Edge { int u, v, w; }; Edge edge[MAX]; int d[MAX], E, F, M, N, W; void add ( int u, int v, int w ) { edge[E].u = u; edge[E].v = v; edge[E++].w = w; } bool Bellman_Ford () { int i, j; for ( i = 1; i <= N; i++ ) d[i] = INF; d[1] = 0; for ( i = 1; i < N; i++ ) for ( j = 0; j < E; j++ ) if ( d[edge[j].v] > d[edge[j].u] + edge[j].w ) d[edge[j].v] = d[edge[j].u] + edge[j].w; for ( j = 0; j < E; j++ ) if (d[edge[j].v] > d[edge[j].u] + edge[j].w) return false; return true; } int main() { scanf("%d",&F); while ( F-- ) { scanf("%d%d%d",&N,&M,&W); int i, u, v, w; E = 0; for ( i = 1; i <= M; i++ ) { scanf("%d%d%d",&u,&v,&w); add(u,v,w), add(v,u,w); } for ( i = 1; i <= W; i++ ) { scanf("%d%d%d",&u,&v,&w); add(u,v,-w); } if ( !Bellman_Ford()) printf("YES\n"); else printf("NO\n"); } return 0; }