卡在奇怪的地方一晚上!!!
思路不难,就是最短路,不过虫洞是正权值的双向通路,过虫洞是负权值的单向通道。
松弛完再判断是否有负权环
#include<stdio.h>
#define INF 999999999
int main()
{
int dis[5000],n,m,c,s,k,e,t,u[6000],v[6000],w[6000];//没错,卡在这里,5000WA一晚上!!!!
scanf("%d",&k);
while(k--)
{
scanf("%d %d %d",&n,&m,&c);
int sum=0;
for(int i=1;i<=m;i++) //正常
{
scanf("%d %d %d",&s,&e,&t);
u[sum]=v[sum+1]=s;
v[sum]=u[sum+1]=e;
w[sum++]=t;
w[sum++]=t;
}
for(int i=1;i<=c;i++) //虫洞
{
scanf("%d %d %d",&s,&e,&t);
u[sum]=s;
v[sum]=e;
w[sum++]=-t;
}
bool flage=1;
for(int i=0;i<4000;i++)
dis[i]=INF;
for(int i=1;i<=n-1;i++) //bellman_ford
{
flage=0;
for(int j=0;j<sum;j++)
{
if(dis[v[j]]>dis[u[j]]+w[j])
dis[v[j]]=dis[u[j]]+w[j],flage=1;
}
if(flage==0)
break;
}
flage=0;
for(int i=0;i<sum;i++) //判负权环
{
if(dis[v[i]]>dis[u[i]]+w[i])
{flage=1;
break;}
}
if(flage)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}