SAP最短增广路算法

#include <iostream> #include <queue> #define msize 1024 //最大顶点数目 using namespace std; int d[msize]; //标号 int r[msize][msize]; //残留网络,初始为原图 int num[msize]; //num[i]表示标号为i的顶点数有多少 int pre[msize]; int n,m,s,t; //m个顶点,n条边,从源点s到汇点t void ini_d() //BFS计算标号,汇点t标号为0 { int k; queue<int>Q; memset(d,1,sizeof(d)); memset(num,0,sizeof(num)); Q.push(t); d[t]=0; num[0]=1; while (!Q.empty()) { k=Q.front(),Q.pop(); for (int i=0;i<m;i++) { if (d[i]>=m&&r[i][k]>0) { d[i]=d[k]+1; Q.push(i); num[d[i]]++; } } } } int findAlowArc(int i) //从i出发寻找允许弧 { int j; for (j=0;j<m;j++) if (r[i][j]>0&&d[i]==d[j]+1) return j; return -1; } int reLable(int i) //重新标号 { int mm=INT_MAX; for (int j=0;j<m;j++) if (r[i][j]>0) mm=min(mm,d[j]+1); return mm==INT_MAX?m:mm; } int maxFlow(int s,int t) //从源点s出发的最大流 { int flow=0,i=s,j; int delta; //增量 memset(pre,-1,sizeof(pre)); while (d[s]<m) { j=findAlowArc(i); if (j>=0) { pre[j]=i; i=j; if (i==t) //更新残留网络 { delta=INT_MAX; for (i=t;i!=s;i=pre[i]) delta=min(delta,r[pre[i]][i]); for (i=t;i!=s;i=pre[i]) r[pre[i]][i] -= delta, r[i][pre[i]] += delta; flow += delta; } } else { int x=reLable(i); //重新标号 num[x]++; num[d[i]]–; if (num[d[i]]==0) return flow; //间隙优化 d[i]=x; if (i!=s) i=pre[i]; } } return flow; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值