poj 3259 Wormholes spfa判负环

#第一以为是直接传送看贝西会不会无限循环那道题,直接洛谷搬过来交了一发,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;
    }
}

 

上一篇:最短路(搬运)


下一篇:题解 CF1579C Ticks