#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int f,n,m,w;
bool rel;
struct len
{
int xx,yy,vv;
}a[25500];//开边集数组记录每条边起点终点权值;
int ti=1;
void read()
{
cin>>n>>m>>w;
for(int i=1;i<=m;i++)
{
cin>>a[i].xx>>a[i].yy>>a[i].vv;
a[i+m].xx=a[i].yy;
a[i+m].yy=a[i].xx;
a[i+m].vv=a[i].vv;
}//因为普通的洞口间的通道是双向(无向)所以赋值两次;
for(int i=2*m+1;i<=w+2*m;i++)
{
cin>>a[i].xx>>a[i].yy>>a[i].vv;
a[i].vv=0-a[i].vv;
}//虫洞(负权边)是有指向(单向);
}
int dis[60000];
bool SP_Bellman(int s)//布尔曼福德算法求是否存在负权回路;
{
memset(dis,10,sizeof(dis));//初始化
dis[s]=0;
for(int i=1;i<=n;i++)//只需做n次判断
{
rel=false;
for(int j=1;j<=m*2+w;j++)
if(dis[a[j].xx]+a[j].vv<dis[a[j].yy])
{
dis[a[j].yy]=a[j].vv+dis[a[j].xx];
rel=true;
}//松弛;
if (!rel) return 0;
}
return 1;
}//如果n次判断后还能进行松弛那图中就一定有负权回路;
int main()
{
cin>>f;
for(int i=1;i<=f;i++)
{
read();
if(!SP_Bellman(1)) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}//输出;
return 0;
}
Oj P1216 虫洞
最新推荐文章于 2022-01-30 14:54:02 发布