/**
* poj3259 Bellman-Ford
* 这个题最开始的时候有点钻牛角尖了,只记得Bellman_Ford是单源,而这个题并没有指定源是哪个,就用了Floyd,结果不对
* 想了下,Floyd好像并没有负向环路判断的功能,而这个题只是要检测负向环路,起点在哪里根本就无所谓,选一个根本都不存在的起点都可以
* 于是果断改用BF了
*/
#include <cstdio>
int f;
int n,m,w;
int idx;
struct path{
int start;
int end;
int cost;
}p[5300];
int timecost[501];
bool bellman_ford(){//有环路返回false
bool flag;
for(int i=0;i<n;++i){
flag = false;
for(int j=0;j<idx;++j){
if(timecost[p[j].end] > timecost[p[j].start] + p[j].cost){
timecost[p[j].end] = timecost[p[j].start] + p[j].cost;
flag = true;
}
}
if(!flag){
break;
}
}
for(int j=0;j<idx;++j){
if(timecost[p[j].end] > timecost[p[j].start] + p[j].cost){
return false;
}
}
return true;
}
int main(){
int a,b,tcost;
scanf("%d",&f);
while(f--){
idx = 0;
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;++i){
timecost[i] = 1<<30;
}
for(int i=1;i<=m;++i){
scanf("%d%d%d",&a,&b,&tcost);
p[idx].start = a;
p[idx].end = b;
p[idx++].cost = tcost;
p[idx].start = b;
p[idx].end = a;
p[idx++].cost = tcost;
}
for(int i=1;i<=w;++i){
scanf("%d%d%d",&a,&b,&tcost);
p[idx].start = a;
p[idx].end = b;
p[idx++].cost = tcost*-1;
}
if(bellman_ford()){
printf("NO\n");
}
else{
printf("YES\n");
}
}
return 0;
}
poj3259 Bellman_Ford
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/northsnow_bupt/article/details/21420467
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/northsnow_bupt/article/details/21420467
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。