裸的Floyd,单纯三重循环,比较好理解
有负权边,一起处理即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define ll long long
#define ld long double
#define INF 0x3f3f3f3f
using namespace std;
int G[502][502],n;
bool floyd() {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
for(int k=1; k<=n; k++) {
if(G[j][i]+G[i][k]<G[j][k])
G[j][k]=G[j][i]+G[i][k];
}
}
if(G[i][i]<0)
return 1;
}
return 0;
}
int main() {
std::ios::sync_with_stdio(false);
//cin.tie(0);
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int t;
cin>>t;
while(t--) {
int m,w;
cin>>n>>m>>w;
int a,b,c;
memset(G,0x3f,sizeof G);
for(int i=1; i<=n; i++)
G[i][i]=0;
for(int i=0; i<m; i++) {
cin>>a>>b>>c;
if(c<G[a][b])
G[a][b]=G[b][a]=c;
}
for(int i=0; i<w; i++) {
cin>>a>>b>>c;
G[a][b]=-c;
}
if(floyd())
cout<<"YES"<<'\n';
else
cout<<"NO"<<'\n';
}
return 0;
}