http://poj.org/problem?id=3259
Bellman_Ford判定负环。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N,M,W,num;
int dis[3000];
struct NODE{
int to;
int from;
int value;
}node[2500 << 2];
bool Bellman_Ford(){
for(int i=1; i<=N; i++)
dis[i] = 1e9;
dis[1] = 0;
bool flag;
for(int i=0; i<N-1; i++){
flag = false;
for(int j=1; j<=num; j++){
if(dis[node[j].to] > dis[node[j].from] + node[j].value){
dis[node[j].to] = dis[node[j].from] + node[j].value;
flag = true;
}
}
if(!flag) break;
}
for(int i=1; i<=num; i++){
if(dis[node[i].to] > dis[node[i].from] + node[i].value)
return true;
}
return false;
}
int main(){
// freopen("in.txt", "r", stdin);
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d%d%d",&N,&M,&W);
num = 0;
int from,to,value;
for(int i=0; i<M; i++){
scanf("%d%d%d",&from,&to,&value);
num++;
node[num].from = from;
node[num].to = to;
node[num].value = value;
num++;
node[num].from = to;
node[num].to = from;
node[num].value = value;
}
for(int i=0; i<W; i++){
scanf("%d%d%d",&from,&to,&value);
num++;
node[num].from = from;
node[num].to = to;
node[num].value = -value;
}
if(Bellman_Ford()) puts("YES");
else puts("NO");
}
return 0;
}