终于用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");
}
}