http://poj.org/problem?id=2983

终于用spfa把它AC了,,,这道题把我这几天满满的自信都打击的木有了,,,,,一开始用bellman——ford做的还算顺利,但是我想用spfa做一下,,,于是就向别人那样用了头插法,,但是悲剧的是我每次提交总是一个样WA,,,,我于是上网搜了搜,,发现spfa的都是用的是链表,,,但他们不是用的指针,,而我用的是指针,,,就这一点区别,,我的就是过不了,,,太打击人了,,,心在滴血啊,,,,,我的Ac之路,,,充满了这么多坎坷,,,走在ac之路的我是break还是continue呢,,,谁能告诉我,,,,这道题虽然ac了,,但我却没有以往的高兴,,,这是为什么呢?

AC代码:

#include<iostream>
#include<string.h>
#include<queue>
#include<cstdio>
#define N 1005
#define M 500000
#define INF 1000000000
using namespace std;
struct Node{ int to,len,next;
       }node[M];
int dist[N],adj[N],cnt[N];
bool visit[N];
int size,n,m;
void init()
{    size=0;
     for(int i=0;i<=n;++i)
      { adj[i]=-1;
         dist[i]=INF;
         visit[i]=false;
         cnt[i]=0;
      }
}
void Add(int a,int b,int c)
{  node[size].to=b;
   node[size].len=c;
   node[size].next=adj[a];
   adj[a]=size++;
}
bool spfa()
{   queue<int>Q;
    dist[0]=0;
    visit[0]=true;
     cnt[0]=1;
    Q.push(0);
    while(!Q.empty())
    {  int u=Q.front();
        Q.pop();
        visit[u]=false;
        for(int i=adj[u];i!=-1;i=node[i].next)
        {  int v=node[i].to;
            int w=node[i].len;
             if(dist[v]>dist[u]+w)
              {  dist[v]=dist[u]+w;
                  if(!visit[v])
                  {   Q.push(v);
                      visit[v]=true;
                      if(++cnt[v]>n) return false;
                  }
              }
            }
       
    }
    return true;
     }
int main()
{   while(scanf("%d%d",&n,&m)!=EOF)
   { init();
     for(int i=0;i!=m;++i)
     {   int a,b,c;
         char ch;
         getchar();
         scanf("%c%d%d",&ch,&a,&b);
         if(ch=='P')
         { scanf("%d",&c);
            Add(a,b,-c);
            Add(b,a,c);
         }
         else if(ch=='V')
          {Add(a,b,-1);}
         }
         for(int i=1;i<=n;++i)
          Add(0,i,0);
          if(spfa())  printf("Reliable\n") ;
           else printf("Unreliable\n");
         }
    }


你可能感兴趣的:(http://poj.org/problem?id=2983)