题意:有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;
}