题意:
第一行:N个地点 M个路径(正值) 虫洞个数(虫洞就是代表权值为负,也就是时光倒流)
。。
问这个人是否走了这些点可以通过虫洞回家,让时间恰好是他离开的时候
思路:就是用bellman求负环 有负环说明可以时光倒流 时间减少
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAXN 27000
#define INF 0x3f3f3f3f
using namespace std;
struct node
{
int x,y,t;
} endge[MAXN];
int d[MAXN];
int n,m,w;
int bellmen_ford()
{
int i;
for(i = 1; i <= n; i ++)
d[i] = INF;
int ans = 1;
bool flag = true;
while(flag)
{
flag = false;
//ans++;
if(ans >n) return 1;
ans ++;
for(i = 1; i <= m; i ++)
{
if(d[endge[i].x] + endge[i].t < d[endge[i].y])
{
d[endge[i].y] = d[endge[i].x] + endge[i].t;
flag = true;
}
if(d[endge[i].y] + endge[i].t < d[endge[i].x])
{
d[endge[i].x] = d[endge[i].y] + endge[i].t;
flag = true;
}
}
for(; i <= m + w; i++)
{
if(d[endge[i].x] - endge[i].t < d[endge[i].y])
{
d[endge[i].y] = d[endge[i].x] - endge[i].t;
flag = true;
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T --)
{
scanf("%d%d%d",&n,&m,&w);
for(int i = 1; i <= m + w; i ++)
{
scanf("%d%d%d",&endge[i].x,&endge[i].y,&endge[i].t);
}
if(bellmen_ford())
printf("YES\n");
else printf("NO\n");
}
return 0;
}