#include<stdio.h>
#include<string.h>
#define M 600
#define oo 999999
int n,m,w;
int map[M][M];
int dis[M];
int time[M];//记录某个点入队的次数
int que[M*M];
bool v[M];//是否更新过
bool inq[M];//是否已经在队列中
int min(int a,int b)
{
if(a<b) return a;
return b;
}
bool spfa(int x)
{
int i,p;
int L=0,R=0;
for(i=1;i<=n;i++)
{
dis[i]=oo;
time[i]=0;
inq[i]=false;
}
que[R++]=x;
inq[x]=true;
time[x]++;
dis[x]=0;
while(L<R)
{
p=que[L++];
inq[p]=false;
for(i=1;i<=n;i++)
if(dis[i]>dis[p]+map[p][i])
{
dis[i]=dis[p]+map[p][i];
v[i]=true;
if(!inq[i])
{
que[R++]=i;
inq[i]=true;
time[i]++;
if(time[i]>=n)//当某个点入队超过或等于n次就表明有负环
return true;
}
}
}
return false;
}
int main()
{
int cas;
int i,j;
int s,e,t;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d%d",&n,&m,&w);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=oo;
while(m--)
{
scanf("%d%d%d",&s,&e,&t);
map[s][e]=min(map[s][e],t);
map[e][s]=min(map[e][s],t);
}
while(w--)
{
scanf("%d%d%d",&s,&e,&t);
map[s][e]=min(map[s][e],-t);
}
memset(v,false,sizeof(v));
for(i=1;i<=n;i++)
{
if(v[i]) continue;
if(spfa(i)) break;
}
if(i<=n) printf("YES\n");
else printf("NO\n");
}
}
POJ 3259 有负权的最短路 SPFA
最新推荐文章于 2017-08-22 15:54:56 发布