这个题意好坑爹。。。完全看不懂
看了别人的意思才理解了。
题意就是 给出 一个图 m个无向边 w个有向边 有向边的权值是负的 现在要看图中有没有负权回路。
只要bellman—ford就行了。不用管起点终点 如果n-1次松弛后还能松弛说明有负权环
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=10010;
const int inf=1<<10;
struct Edge
{
int f,t,w;
};
Edge edge[maxn];
int dis[maxn];
int n,m,w,k;
bool Bellman_ford()
{
int i,j;
for(i=1; i<=n; ++i)
dis[i]=inf;
bool ischanged;
for(i=1; i<n; ++i)
{
ischanged=false;
for(j=1; j<=k; ++j)
{
if(dis[edge[j].t] > dis[edge[j].f] + edge[j].w)
{
dis[edge[j].t]=dis[edge[j].f]+edge[j].w;
ischanged=true;
}
}
if(!ischanged)
return false;
}
for(i=1; i<=k; ++i)
{
if(dis[edge[i].t] > dis[edge[i].f] + edge[i].w)
return true;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
int a,b,c;
while(T--)
{
scanf("%d %d %d",&n,&m,&w);
k=0;
for(int i=1; i<=m; ++i)
{
scanf("%d %d %d",&a,&b,&c);
k++;
edge[k].f=a;
edge[k].t=b;
edge[k].w=c;
k++;
edge[k].f=b;
edge[k].t=a;
edge[k].w=c;
}
for(int i=1; i<=w; ++i)
{
scanf("%d %d %d",&a,&b,&c);
edge[++k].f=a;
edge[k].t=b;
edge[k].w=-c;
}
if(Bellman_ford())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}