问题
Worm hole
在探索他的农场时,乔恩发现了几个惊人的黑洞。黑洞是从当前的农场通往其他农场的奇怪的单向通道,可以把时光倒流到比你进去的时间之前。乔恩的农场构成为N个农场和M个双向通道,W个黑洞。还有为了方便,我们在农场上贴了农场1, 农场2, … ,农场 N的名称。
乔恩突然好奇从当前位置出发旅行后,重新回到当前位置时,是否会时光倒流。请帮助乔恩编写是否能做时光倒流的旅行的程序。
输入
第一行给出测试用例个数T。 (1 ≤ T ≤ 5)
每个测试用例的第一行给出农场数N, 通道数M, 黑洞数W。(1 ≤ N ≤ 500, 1 ≤ M ≤ 2,500, 1 ≤ W ≤ 200)
每个测试用例的第二行,通过M行空格划分给出双向通道的信息s, e, t。 s, e是有相关通道的地点号码, t是通过该通道移动时所需要的时间。(1 ≤ s, e ≤ N, 1 ≤ t ≤ 10,000)
每个测试用例的(M +2)行开始,通过W行空格划分给出黑洞的信息s, e, t。s是该黑洞的开始地点, e是该黑洞的到达地点, t是表示缩短的时间。(1 ≤ s, e ≤ N, 1 ≤ t ≤10,000)
连接两个地点的通道可能是1个以上。
输出
每个测试用例的第一行上输出如果可以时光倒流的话,YES,不可能的话NO。
案例输入
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
案例输出
NO
YES
#include<stdio.h>
#define MAX 5000
#define IM 2100000000
struct xyz{
int x, y, z;
}edge[MAX];
int n, m, k;
int en;
int Dist[MAX];
bool BF(){
int i,j;
bool UD;
for (i = 1; i <= n; i++){
Dist[i] = IM;
}
Dist[1] = 0;
for (i = 0; i <= n; i++){
UD = 0;
for (j = 0; j < en; j++){
if (Dist[edge[j].x] !=IM&&Dist[edge[j].y]>Dist[edge[j].x] + edge[j].z){
Dist[edge[j].y] =Dist[edge[j].x] + edge[j].z;
UD = 1;
}
}
if (i == n&&UD)
return 1;
}
return 0;
}
int main(){
int t, tc;
int i, j;
int s, e, d;
scanf("%d", &t);
for (tc = 0; tc < t; tc++){
scanf("%d%d%d", &n,&m,&k);
en = 0;
for (i = 0; i < m; i++){
scanf("%d%d%d", &s,&e, &d);
edge[en++] = { s, e, d };
edge[en++] = { e, s, d };
}
for (i = 0; i < k; i++){
scanf("%d%d%d", &s,&e, &d);
edge[en++] = { s, e, -d };
}
printf("%s\n",BF()?"YES":"NO");
}
return 0;
}