刚开始是用的邻接矩阵,一直wa,后来看了其他人的代码,又想了想,两个点之间有多条路径,不能只存储权值最小的,因为每个路径都可能是一个最短路的组成部分(但现在还不是想的太清楚),所以有多少条边,就存多少边的信息bellman-ford
#include <iostream> using namespace std; const int maxn=501; const int inf=2<<20; int d[maxn],w[maxn*maxn],u[maxn*maxn],v[maxn*maxn]; int f,n,m,wm,t; bool bellman() { int i,j; for(i=1;i<=n;i++) d[i]=inf; d[1]=0; for(i=1;i<n;i++) { for(j=1;j<=t;j++) { if(d[v[j]]>(d[u[j]]+w[j])) d[v[j]]=d[u[j]]+w[j]; } } for(i=1;i<=t;i++) { if(d[v[i]]>(d[u[i]]+w[i])) return true; } return false; } int main() { cin>>f; while(f--) { cin>>n>>m>>wm; int i; int tu,tv,tw; t=0; for(i=1;i<=m;i++) { cin>>tu>>tv>>tw; t++; u[t]=tu;v[t]=tv;w[t]=tw; t++; u[t]=tv;v[t]=tu;w[t]=tw; } for(i=1;i<=wm;i++) { cin>>tu>>tv>>tw; t++; u[t]=tu;v[t]=tv;w[t]=-tw; } bool flag=bellman(); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }