如果存在负环输出YES
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 10000;
const int inf = 0x3fffffff;
struct Node{
int v,dis;
Node(int v,int dis):v(v),dis(dis){}
};
vector<Node> Adj[maxn];
int n,m,u,v,w,c,f;
int d[maxn+5];
bool bellman(){
bool flag;
for(int i = 0; i < n - 1 ; i++){
flag = false;
for(int u = 1; u <= n; u++){
for(int j = 0; j < Adj[u].size(); j++){
int v = Adj[u][j].v;
int dis = Adj[u][j].dis;
if(d[v] > dis + d[u]) {d[v] = dis + d[u]; flag = true;}
}
}
if(!flag) break;
}
//以下为判断负环的代码负环的意思是一个环的权值加起来为负值
for(int u = 1; u <= n; u++){
for(int j = 0; j < Adj[u].size(); j++){
int v = Adj[u][j].v;
int dis = Adj[u][j].dis;
if(d[u] + dis < d[v]){//仍然可以松弛
return true;
}
}
}
return false;
}
int main(){
cin>>f;
while(f--)
{
for(int i = 0; i < maxn; i++) Adj[i].clear();
fill(d,d+maxn,inf);
cin>>n>>m>>w;
for(int i=0; i<m; i++)
{
cin>>u>>v>>c;
Adj[u].push_back(Node(v,c));
Adj[v].push_back(Node(u,c));
}
for(int i=0; i<w; i++)
{
cin>>u>>v>>c;
Adj[u].push_back(Node(v,-c));
}
if(bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}