解析:判断是否存在回路。
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 5210;
int dis[maxn], cnt[maxn];
bool visit[maxn];
vector<pair<int, int> > e[maxn];
int n, m, W;
bool solve(){
memset(visit, false, sizeof(visit));
memset(cnt, 0, sizeof(cnt));
queue<int> q;
q.push(1);
visit[1] = true;
dis[1] = 0;
cnt[1]++;
while(!q.empty()){
int from = q.front();
q.pop();
visit[from] = false;
for(int i = 0; i < e[from].size(); ++i){
int to = e[from][i].first;
int w = e[from][i].second;
if(dis[to] > dis[from] + w){
dis[to] = dis[from] + w;
if(visit[to] == false)
visit[to] = true, q.push(to), cnt[to]++;
if(cnt[to] > n) return true;
}
}
}
return false;
}
int main(){
int T, from, to, w;
scanf("%d", &T);
while(T--){
fill(dis, dis + maxn, INF);
scanf("%d%d%d", &n, &m, &W);
for(int i = 0; i <= n; ++i)
e[i].clear();
for(int i = 1; i <= m; ++i){
scanf("%d%d%d", &from, &to, &w);
e[from].push_back(make_pair(to, w));
e[to].push_back(make_pair(from, w));
}
for(int i = 1; i <= W; ++i){
scanf("%d%d%d", &from, &to, &w);
e[from].push_back(make_pair(to, -w));
}
if(solve()) printf("YES\n");
else printf("NO\n");
}
return 0;
}