SPFA求负权值回路:
注 : S P F A 求 负 权 值 回 路 要 比 F l o y d 快 ! \red{注:SPFA求负权值回路要比Floyd快!} 注:SPFA求负权值回路要比Floyd快!
// ShellDawn
// POJ3259
// No.12
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define MM(x) memset(x,0,sizeof(x))
#define MMF(x) memset(x,0x3f,sizeof(x))
using namespace std;
#define maxn 505
int n,m,w;
int E[maxn][maxn][2];
int C[maxn];
int ans[maxn];
int dis[maxn];
bool SPFA(){
MM(ans);
MMF(dis);
queue<int> q;
q.push(1);
ans[1]++;
dis[1] = 0;
while(!q.empty()){
int loc = q.front();
q.pop();
for(int i=0;i<C[loc];i++){
int next = E[loc][i][0];
int v = E[loc][i][1];
if(dis[loc] + v < dis[next]){
dis[next] = dis[loc] + v;
q.push(next);
ans[next]++;
if(ans[next] > n) return true;
}
}
}
return false;
}
int main(){
//freopen("A.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
MM(C);
scanf("%d%d%d",&n,&m,&w);
for(int i=0;i<m;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
int c = C[a];
E[a][c][0] = b;
E[a][c][1] = v;
C[a] ++;
c = C[b];
E[b][c][0] =a;
E[b][c][1] = v;
C[b] ++;
}
for(int i=0;i<w;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
int c = C[a];
E[a][c][0] = b;
E[a][c][1] = -v;
C[a] ++;
}
if(SPFA()) puts("YES");
else puts("NO");
}
return 0;
}