题目来源:POJ 3259 Wormholes
题意:某人想回到过去 输入有2中类型的边 一种是正的 并且是双向的 另外一种是负的 是单向的 可以回到过去就输出YES 否则NO
思路:和UVa 558差不多 如果存在负环就可以通过这个负环一直无限时光倒流 找负环用SPFA或者Bellman-Ford
#include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 510; struct edge { int u, v, t; }a[5500]; int d[maxn]; int n, m; bool Bellman_Ford() { for(int i = 1; i <= n; i++) d[i] = 999999999; for(int i = 1; i < n; i++) { for(int j = 0; j < m; j++) { int u = a[j].u, v = a[j].v, t = a[j].t; if(d[v] > d[u] + t) d[v] = d[u] + t; } } for(int i = 0; i < m; i++) { int u = a[i].u, v = a[i].v, t = a[i].t; if(d[v] > d[u] + t) return true; } return false; } int main() { int T; scanf("%d", &T); while(T--) { m = 0; int m1, m2; scanf("%d %d %d", &n, &m1, &m2); for(int i = 0; i < m1; i++) { int u, v, t; scanf("%d %d %d", &u, &v, &t); a[m].u = u; a[m].v = v; a[m++].t = t; a[m].u = v; a[m].v = u; a[m++].t = t; } for(int i = 0; i < m2; i++) { int u, v, t; scanf("%d %d %d", &u, &v, &t); a[m].u = u; a[m].v = v; a[m++].t = -t; } if(Bellman_Ford()) puts("YES"); else puts("NO"); } return 0; }