要判断是否有负的权值
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int map[550][550],n,m,k; int ff() { for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int tt=map[i][k]+map[k][j]; if(map[i][j]>tt) map[i][j]=tt; } if(map[i][i]<0) return 1; } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) map[i][j]=0; else map[i][j]=0x3f3f3f3f; } } for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(c<map[a][b]) map[a][b]=map[b][a]=c; } for(int i=1;i<=k;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); map[a][b]=-c; } if(ff()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }