ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

SAP(最短增广路算法) 最大流模板

2019-08-11 22:36:46  阅读:332  来源: 互联网

标签:pre 标号 增广 int msize num delta SAP 模板


原文链接:http://www.cnblogs.com/ACAC/archive/2010/05/18/1738719.html

#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;

转载于:https://www.cnblogs.com/ACAC/archive/2010/05/18/1738719.html

标签:pre,标号,增广,int,msize,num,delta,SAP,模板
来源: https://blog.csdn.net/weixin_30571465/article/details/99238789

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有