• 最大流学习笔记(5)-前置重贴标签算法一


    上一篇

    1、许可边:设$f$是流网络G的一个预流,$h$是高度函数。对于边$(u,v)$,如果$c_{f}(u,v)>0$且$h(u)=h(v)+1$,那么边$(u,v)$是一个许可边。否则是非许可边。许可网络$G_{f,h}=(V,E_{f,h})$,$E_{f,h}$是许可边的集合

    2、许可网络是有向无环的。因为对于每条许可边$(u,v)$来说,$h(u)=h(v)+1$,所以如果存在环,设环的大小是$k$,那么最后会有$h(u)=h(u)+k$。这是不满足的。

    3、 如果$u$是溢出节点,且$(u,v)$是许可边,则$PUSH(u,v)$可作用于节点$u$上,该操作不产生新的许可边,但有可能导致边$(u,v)$成为非许可边。

    4、如果$u$是一个溢出节点,且不存在从$u$出发的许可边,则$RELABEL(u)$可作用于$u$,操作之后将至少存在一条从$u$出发的许可边,但是不存在进入$u$的许可边。

    5、在该算法中,将所有$u$的邻接边(包括离开$u$的和进入$u$的)都组织成一个链表$u.N$,其中$u.N.head$指向链表第一个节点,$v.next-heighbor$指向下一个,最后一个节点的下一个为$NIL$,$u.current$指向当前的节点。

    6、释放溢出节点:这个操作是将溢出节点$u$的流推送的相邻节点。下面是该函数的实现:

    7、$DISCHARGE$函数进行第7行的$PUSH$操作时该操作适用于节点$u$,执行第4行的$RELABEL$函数时该操作适用于$u$.

    以下是证明

    3的证明

    $PUSH(u,v)$能够产生的唯一的残存边是$(v,u)$,但是$h(u)=h(v)+1$,所以$(v,u)$不可能成为残存边。同时如果该推送是一个饱和推送,则操作后$c_{f}(u,v)=0$,这使得$(u,v)$成为非许可边

    4的证明

    因为对$u$重贴标签是将$u.h$的高度变为从其出发的所有残存边高度最小的加1,所以至少有一条边是到达这个高度最小的节点。

    假设重贴标签之后存在进入$u$ 的边,比如$(w,u)$,那么有$h(w)=h(u)+1$,而操作之前必有$h(w)>h(u)+1$,根据这里的3,$(w,u)$不属于残存边。

    7的证明

    (1)第一行和第六行的判断使得$PUSH$操作是合理的。

    (2)对于$RELABEL$函数,有两种情况:

      i 某次$DISCHARGE$被调用时,$u.current$指向链表的开头,这时当执行第四行时所有的边都是非许可边。所以可以执行重贴标签操作

      ii 某次$DISCHARGE$被调用时,$u.current$指向链表的中间,也就是说执行到中间然后这个函数结束了。现在又回来接着执行。那么我们只需要证明其他节点执行$PUSH$和$RELABEL$操作不会使得$u$到$u.N$开始到$u.current$这中间的节点的边变成许可边就好。首先,其他节点的操作由3可知不可能产生新的许可边。由4可知其他节点进行重贴标签操作不会不会产生进入的边,也就是说没有从$u$出发的边。

    下一篇

  • 相关阅读:
    新功能:查看TrackBack过来的文章
    新功能发布: 数据备份
    小题大作:.Text中恶意脚本过滤的新方法
    新增关闭邮件通知功能
    Will Mono Become the Preferred Platform for Linux Development
    Test Driven Development 资源
    收藏夹注意事项
    功能调整:阅读排行、回复排行
    首页增加了到第二书店的链接
    DotGNU Portable.NET
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/6021282.html
Copyright © 2020-2023  润新知