题目来源: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;
}