求负环自然要用 belllman
#include <stdio.h>
#include <string.h>
int F,n,m,w,p,dist[501];
structnode
{
int s,e,t;
}grid[5500];
int bellman()
{
int i,k;
memset (dist,0,sizeof (dist));
for (k=1;k<=n-1;k++)
for(i=1;i<=p;i++)
if (dist[ grid[i].s ]> dist[ grid[i].e ]+grid[i].t)
dist[ grid[i].s ]=dist[ grid[i].e ]+grid[i].t;
for (i=1;i<=p;i++)
if (dist[ grid[i].s ]> dist[ grid[i].e ]+grid[i].t)
return 1;
return 0;
}
int main()
{
int s,e,t;
scanf("%d",&F);
while (F--)
{
p=1;
memset(grid,0,sizeof(grid));
scanf("%d%d%d",&n,&m,&w);
while(m--)
{
scanf("%d%d%d",&s,&e,&t);
grid[p].s=s;grid[p].e=e;grid[p++].t=t;
grid[p].s=e;grid[p].e=s;grid[p++].t=t;
}
while(w--)
{
scanf("%d%d%d",&s,&e,&t);
grid[p].s=s;grid[p].e=e;grid[p++].t=-t;
}
printf("%s\n",bellman()?"YES":"NO");
}
return 0;
}