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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值