题意:有T组测试数据,N个点,M条双向边,W条负权单向边。问是否存在负权回路。
bellman_ford。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=3005; int dis[N]; struct node { int x,y,w; void fun(int a,int b,int c){x=a;y=b;w=c;} }edge[N*2]; int main() { int t; scanf("%d",&t); while(t--) { memset(dis,0x7f,sizeof(dis)); int n,m,w,all=0; scanf("%d%d%d",&n,&m,&w); for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); edge[all++].fun(a,b,c); edge[all++].fun(b,a,c); } for(int i=0;i<w;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); edge[all++].fun(a,b,-c); } dis[1]=0; for(int i=1;i<n;i++) { bool flag=0; for(int j=0;j<all;j++) { int x=edge[j].x,y=edge[j].y,w=edge[j].w; if(dis[y]>dis[x]+w) { dis[y]=dis[x]+w; flag=1; } } if(!flag) break; } bool flag=0; for(int i=0;i<all;i++) { int x=edge[i].x,y=edge[i].y,w=edge[i].w; if(dis[y]>dis[x]+w) { dis[y]=dis[x]+w; flag=1; break; } } if(flag) puts("YES"); else puts("NO"); } return 0; }