1.思路分析
用Bellman-Ford方法即可解决。判断负环。
2.方法设计及性能衡量
注意边可以双向走,虫洞单向,还有数组的临界范围即可。
3.实现部分
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
struct edge{int from,to,cost;};
edge eg[6000];
int d[520];
int F,N,M,W,E;
int find_negative_loop(){
memset(d,0,sizeof(d));
int i,j;
for(i=0;i<N;i++){
for(j=0;j<E;j++){
edge e=eg[j];
if(d[e.to]>d[e.from]+e.cost){
d[e.to]=d[e.from]+e.cost;
if(i==N-1)return 1;
}
}
}
return 0;
}
int main(){
scanf("%d",&F);
int i;
for(i=0;i<F;i++){
scanf("%d%d%d",&N,&M,&W);
int j,a,b,c;
E=0;
for(j=0;j<M;j++){
scanf("%d%d%d",&a,&b,&c);
eg[E].from=a;
eg[E].to=b;
eg[E].cost=c;
E++;
eg[E].from=b;
eg[E].to=a;
eg[E].cost=c;
E++;
}
for(j=0;j<W;j++){
scanf("%d%d%d",&a,&b,&c);
eg[E].from=a;
eg[E].to=b;
eg[E].cost=-c;
E++;
}
if(find_negative_loop())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}