POJ - 1364 SPFA来解

本文详细介绍了在使用SPFA算法解决图论问题时应注意的几点关键点,包括如何处理从0开始的顶点索引问题,并通过实例展示了Bellman-Ford算法中线段方向错误可能导致的问题及正确修正方法。文章旨在帮助读者深入理解并有效应用这些算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同上...用SPFA...发现了一些值得注意的地方...

首先这个题的 Si...i是从0开始的....所以如果用超级源点..不能用0点..所以我干脆就没用超级点...直接开始的时候所有点入队~~效果是一样的

上面贴的Bellman-Ford有个很大的错误...就是 line [ ] 的有向边都搞反了....但Bellman-Ford本来就是无序的...并且只要判断有没有环..所以照样AC..

但SPFA就不同...是什么图就要是什么图...Dizzy....这里卡了好久才检查出来..因为没想到这里会错...

Program:

#include<iostream> #include<stdio.h> #include<string.h> #define ok printf("ok!!\n") #include<queue> using namespace std; struct pp { int x,y,k,next; }line[110]; int n,m,i,link[110]; char c; queue<int> myqueue; bool SPFA() { int i,j,k,h,d[110],sum[110]; bool used[110]; while (!myqueue.empty()) myqueue.pop(); for (i=0;i<=n;i++) { myqueue.push(i); used[i]=true; d[i]=0; sum[i]=1; } while (!myqueue.empty()) { h=myqueue.front(); myqueue.pop(); used[h]=false; k=link[h]; while (k) { if (d[line[k].y]>d[h]+line[k].k) { d[line[k].y]=d[h]+line[k].k; if (!used[line[k].y]) { myqueue.push(line[k].y); sum[line[k].y]++; if (sum[line[k].y]>n) return false; used[line[k].y]=true; } } k=line[k].next; } } return true; } int main() { while (~scanf("%d",&n)) { if (!n) break; int x,y,k; scanf("%d",&m); memset(link,0,sizeof(link)); memset(line,0,sizeof(line)); for (i=1;i<=m;i++) { scanf("%d%d",&x,&y); y=x+y; c=getchar(); while (c==' ') c=getchar(); getchar(); scanf("%d",&k); if (c=='g') { line[i].x=y; line[i].y=x-1; line[i].k=-k-1; }else { line[i].x=x-1; line[i].y=y; line[i].k=k-1; } line[i].next=link[line[i].x]; link[line[i].x]=i; } if (SPFA()) printf("lamentable kingdom\n"); else printf("successful conspiracy\n"); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值