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
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
判断是否有负环
再次熟悉了一下bellman_ford
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const long INF = 10000000; struct ty { long s, t; double w; }; long t, n, m, w, e; ty edge[6010]; double dist[1010]; void insertedge(long x, long y, double z, long k) { //cout << x << ' ' << y<< ' ' << z <<endl; edge[k].s = x; edge[k].t = y; edge[k].w = z; } void init() { e = 0; scanf("%d%d%d", &n, &m, &w); for (long i = 1; i <= m; i++) { long s, t, l; scanf("%d%d%d", &s, &t, &l); insertedge(s, t, l , ++e); insertedge(t, s, l , ++e); } for (long i = 1; i <= w; i++) { long s, t, l; scanf("%d%d%d", &s, &t, &l); insertedge(s, t, -l , ++e); } } bool bellman_ford() { int i, j; for(i = 2; i <= n; i ++) dist[i] = INF; for(i = 1; i < n; i ++) { bool boo = true; for(j = 1; j <= e; j ++) { int u = edge[j].s; int v = edge[j].t; int w = edge[j].w; if(dist[v] > dist[u] + w) { dist[v] = dist[u] + w; boo = false; } } if(boo) break; } for(i = 1; i <= e; i ++) { int u = edge[i].s; int v = edge[i].t; int w = edge[i].w; if(dist[v] > dist[u] + w) return false; } return true; } int main() { freopen("poj3259.in", "r", stdin); scanf("%d",&t); while (t--) { init(); bool b = false; if(!bellman_ford()) printf("YES\n"); else printf("NO\n"); } return 0; }