POJ 3259-Wormholes(判全图负环)

大水题
code:

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring> 
using namespace std;
#define maxn 3005
int head[maxn],cnt,n,m,w,vis[maxn],num[maxn],dis[maxn];
struct node{
 int to;
 int from;
 int w;
}edge[maxn*2];
void add(int u,int v,int w)
{
 cnt++;
 edge[cnt].to = v;
 edge[cnt].from = head[u];
 edge[cnt].w = w;
 head[u] = cnt;
}
 
bool spfa()
{
 queue<int>q;
 vis[1] = 1;
 q.push(1);
 num[1] = 1;
 dis[1] = 0;
 while(!q.empty())
 {
  int x = q.front();
  q.pop();
  vis[x] = 0;
  for(int i=head[x];i;i=edge[i].from)
  {
   int to = edge[i].to;
   if(dis[to]>dis[x]+edge[i].w)
   {
    dis[to] = dis[x]+edge[i].w;
    if(!vis[to])
    {
     vis[to] = 1;
     q.push(to);
     num[to]++;
     
    }
   
   }
   if(num[to]>=n)return 1;
  }
 }
 return 0;
}
int main()
{
 int t;
 cin>>t;
 while(t--)
 {
  memset(head,0,sizeof head);
  memset(edge,0,sizeof edge);
  memset(vis,0,sizeof vis);
  memset(dis,0x3f,sizeof dis);
  memset(num,0,sizeof num);
  cnt = 0;
  cin>>n>>m>>w;
  for(int i=1;i<=m;i++)
  {
   int u,v,p;
   scanf("%d%d%d",&u,&v,&p);
   add(u,v,p);add(v,u,p);
  }
  for(int i=1;i<=w;i++)
  {
   int u,v,p;
   scanf("%d%d%d",&u,&v,&p);
   add(u,v,-1*p);
//   add(v,u,-1*p); 
  }
  if(spfa())printf("YES\n");
  else printf("NO\n");
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值