POJ - 3159 不卡建图,几乎赤果果的差分约束+SPFA..

本文介绍了一种使用SPFA算法解决图论中寻找最大差异路径的问题。通过实例解释了如何利用栈实现SPFA算法,并提供了完整的C++代码示例。特别讨论了在本问题中使用栈而非队列的原因。

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

题意是说...有N个小朋友..每个人有糖果..给出M给关于两两手中糖果数关系..a b c 代表b手中的糖果不会比a打出c个..求小朋友间两人差距可能最大会是多少...

抽象来就是给出 M 个关系 a - b <= c 之类的..然后求两两之差最大的值....这道题不会卡建图..用SPFA也没必要用超级点或者先把所有点入列...

但这道题用SPFA十分蛋疼的是用queue会超时...用stack就过了~~至今不知道为什么....实在SPFA用queue和stack应该是没区别的....


Prgram:

#include<iostream> #include<stack> #define MAXN 30001 using namespace std; struct p1 { int x,y,next,k; }line[MAXN*10]; int n,m,i,link[MAXN]; stack<int> mystack; int SPFA() { int k,h,i,d[MAXN]; bool used[MAXN]; while (!mystack.empty()) mystack.pop(); memset(used,false,sizeof(used)); memset(d,0x7F,sizeof(d)); d[1]=0; mystack.push(1); while (!mystack.empty()) { h=mystack.top(); mystack.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]) { used[line[k].y]=true; mystack.push(line[k].y); } } k=line[k].next; } } return d[n]; } int main() { while(~scanf("%d%d",&n,&m)) { memset(link,0,sizeof(link)); for (i=1;i<=m;i++) { scanf("%d%d%d",&line[i].x,&line[i].y,&line[i].k); line[i].next=link[line[i].x]; link[line[i].x]=i; } printf("%d\n",SPFA()); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值