题意:判断是否存在负环
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Max 0xfffffff
struct node
{
int from;
int to;
int t;
}s[10010];
int dis[10010];
bool bellmanford(int n,int p)
{
int i,j;
bool flag;
for(i = 0; i <= n; i++)
{
flag = false;
for(j = 0; j < p; j++)
{
if(dis[s[j].to] > dis[s[j].from] + s[j].t)
{
dis[s[j].to] = dis[s[j].from] + s[j].t;
flag = true;
}
}
if(!flag)
break;
}
if(!flag)
return false;
else
return true;
}
int main()
{
int f;
int i,a,b,c;
int n,m,w;
scanf("%d",&f);
while(f--)
{
int n,m,w;
scanf("%d%d%d",&n,&m,&w);
int p = 0;
memset(dis,Max,sizeof(dis));
//边是双向的
for(i = 0; i < m; i++)
{
scanf("%d%d%d",&a,&b,&c);
s[p].from = a;
s[p].to = b;
s[p+1].from = b;
s[p+1].to = a;
s[p++].t = c;
s[p++].t = c;
}
//虫洞传送的路径,注意权值为负
for(i = 0; i < w; i++)
{
scanf("%d%d%d",&a,&b,&c);
s[p].from = a;
s[p].to = b;
s[p++].t = -c;
}
if(bellmanford(n,p))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}