ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poj 3259 Wormholes spfa判负环

2021-10-07 14:34:36  阅读:152  来源: 互联网

标签:3259 now vis int 判负 spfa edge include dis


#第一以为是直接传送看贝西会不会无限循环那道题,直接洛谷搬过来交了一发,wa了

哦,不是,是时间旅行者JOHN.

#建图+判负环

虫洞单向边,权值为负;

路径双向边,权值为正;

#判负环的条件是入队次数>n

---

坑点:

听说poj的评测机菜到动用min不行要手写if;

还听说连三目运算都会被卡;

我的坑点是老把dis[]里面的那个字母写成枚举边时的i,写嗨了手就残了..

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,m,w,flag=0,t=0,vis[10000],dis[10000],head[10000],cnt[10000];
struct node{
    int to,val,next;
}edge[10000];
void add(int a,int b,int cost)
{
    t++;
    edge[t].next=head[a];
    edge[t].to=b;
    edge[t].val=cost;
    head[a]=t;
}
void unit( )
{
    
    flag=0;
    t=0;
    memset(head,0,sizeof(head));
    memset(vis,0,sizeof(vis));
    memset(cnt,0,sizeof(cnt));
}
queue<int>q;
int main( )
{
    
//    freopen("lys.in","r",stdin);
    
    int t;
    cin>>t;
    while(t--)
    {
         cin>>n>>m>>w;
         //cout<<n<<m<<w<<endl;
         unit( );
         for(int i=1;i<=m;i++)
          {
              int a,b,c;
              cin>>a>>b>>c;
            add(a,b,c);
              add(b,a,c);
          }
          for(int i=1;i<=w;i++)
          {
              int a,b,c;
              cin>>a>>b>>c;
              add(a,b,-c);
          }
          
          memset(dis,0x3f3f3f,sizeof(dis));
          vis[1]=1;
          dis[1]=0;
          q.push(1);
          
          
          
          while(!q.empty())
          {
              
              int now=q.front();
              vis[now]=0;
              cnt[now]++;
              q.pop( );
              
              if(cnt[now]>n)
               {
                   
                   flag=1;break;
               }
               
               
              for(int i=head[now];i;i=edge[i].next)
              {
                  int to=edge[i].to;
                   if(dis[to]>dis[now]+edge[i].val)
                    {
                        dis[to]=dis[now]+edge[i].val;
                    if(vis[to]==0)
                        {
                            vis[to]=1;
                            q.push(to);
                        }
                    }
                  
               } 
          }
          
          if(flag)
          {
              cout<<"YES"<<endl;
          }
          else cout<<"NO"<<endl;
    }
}

 

标签:3259,now,vis,int,判负,spfa,edge,include,dis
来源: https://www.cnblogs.com/liyishui2003/p/15375817.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有