Oj P1216 虫洞

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值