预流推进








预流推进算法



预流推进算法(压入与重标记方法):

预流推进算法将网络从源点到汇点至于从上到下的高度中。在算法执行过程中,每个节点的存留量(入流-出流)>=0,当一个点的存留量大于零时,则称此结点为活结点。算法从源点开始向下推流,通过不断地寻找活结点,将流量推向以该点为起点的可推流边(可推流边指与该点相连且高度比该点小1的边),该过程即为压入。如果在该点处找不到可推流边,则将该点的高度加1,以实现将过大的流向后推进,该过程称为重标记。因此,在预流推进算法的一次迭代中,要么执行压入操作,要么执行重标记操作。

综上,预流推进算法的框架:

1)、构造初始流。将源点高度标记为n,其余点高度均为0;

2)、如果残留网络中不存在活结点,则算法结束。否则继续执行下一步;

3)、选取活结点,如果该结点出边为可推流边,则沿此边推流,否则将该节点高度加1,执行步骤2)。

g[][]为每边的容量,c[]为每个点的存留量,h[]为每个顶点的高度,sum为最大流。

则预流推进算法代码如下:

void maxflow(int s,int e)

{

         memset(c,0,sizeof(c));

         c[s]=MAXINT;

         c[e]=-MAXINT;

         memset(h,0,sizeof(h));

         h[s]=n;

         sum=0;

        

         queue<int> que;                 //活顶点队列

         que.push(s);

    while(!que.empty())

         {

                   int u=que.front();

                   que.pop();

                  

                   for (int i=0;i<n;i++)

                            if (u==s||h[u]==h[i]+1)

                            {

                                     push(u,i,e);

                                     if (i!=s&&i!=e) que.push(i);

                            }

                   if (u!=s&&u!=e&&c[u]>0)

                   {

            relabel(u);

            que.push(u);

        }

         }

}

void push(int u,int v,int e)

{

         int min=c[u]<g[u][v]? c[u] : g[u][v];

         if (v==e) sum+=min;

         g[u][v]-=min;

         g[v][u]=+min;

         c[u]-=min;

         c[v]+=min;

}

void relabel(int u)

{

         h[u]++;

}


http://hi.baidu.com/hins_pan/item/e9e4e1da57b601ec54347f28

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值