ybaidukuai 发表于 2015-9-17 12:48:27

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

  #include <iostream>
#include <queue>
#define msize 1024      //最大顶点数目
using namespace std;

int d;         //标号
int r;    //残留网络,初始为原图
int num;         //num表示标号为i的顶点数有多少
int pre;
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=0;
    num=1;
    while (!Q.empty())
    {
      k=Q.front(),Q.pop();
      for (int i=0;i<m;i++)
      {
            if (d>=m&&r>0)
            {
                d=d+1;
                Q.push(i);
                num]++;
            }
      }
    }
}

int findAlowArc(int i)       //从i出发寻找允许弧
{
    int j;
    for (j=0;j<m;j++) if (r>0&&d==d+1) return j;

    return -1;
}

int reLable(int i)         //重新标号
{
    int mm=INT_MAX;
    for (int j=0;j<m;j++)
      if (r>0) mm=min(mm,d+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<m)
    {
      j=findAlowArc(i);
      if (j>=0)
      {
            pre=i;
            i=j;
            if (i==t)         //更新残留网络
            {
                delta=INT_MAX;
                for (i=t;i!=s;i=pre) delta=min(delta,r]);
                for (i=t;i!=s;i=pre) r] -= delta, r] += delta;
                flow += delta;
            }
      }
      else
      {
            int x=reLable(i);       //重新标号
            num++;
            num]–;
            if (num]==0) return flow;      //间隙优化
            d=x;
            if (i!=s) i=pre;
      }
    }

    return flow;
  }
页: [1]
查看完整版本: SAP(最短增广路算法) 最大流模板