POJ-1716 同上..SPFA差分约束..

本文介绍了一个基于SPFA算法解决的最短路径问题,通过构建图模型来寻找从指定起点到终点的最小代价路径。该问题类似于POJ1201,但条件更加简化,要求在a到b之间至少包含两个节点。

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

题意和POJ1201相似..但更简单..就是说 a 到 b 至少有两个数...问整个集合最少需要多少元素...

约束条件也就是 Sb - S(a-1) >=2...同POJ1201的构图和解法就是了...

Program :

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值