最大流学习笔记(3)-推送重贴标签算法一

上一篇

1 预流:预流是一个$V\times V \rightarrow  R$的函数$f$,该函数对于每个节点$u\in V-\{s\}$满足容量限制条件和下面的性质:

$\sum_{v\in V}f(v,u)-\sum_{v\in V}f(u,v)\geq 0$

定义$e(u)=\sum_{v\in V}f(v,u)-\sum_{v\in V}f(u,v)$为进入节点$u$的超额流。如果$e(u)>0$,称$u$溢出

2 高度函数的定义:设G是一个流网络,如果函数$f:V\rightarrow N$满足$h(s)=|V|,h(t)=0$,且对任意的边$(u,v)\in E_{f}$,有$h(u)\leq h(v)+1$,那么$h$是一个高度函数

3 对于任意两个节点$u,v\in V$,如果$h(u)>h(v)+1$,那么$(u,v)\notin E_{f}$

4 推送重贴标签算法的思想是在算法的任何时候,维护一个预流$f$和高度函数$h$,并且使用推送操作重贴标签操作来进行更新。

5 推送操作:如果$u$是一个溢出节点,$c_{f}(u,v)>0$,且$h(u)=h(v)+1$,那么推送操作$PUSH(u,v)$作用于节点$u,v$。设节点$u$的超额流存放在$u.e$,高度存放在$u.h$。下面是推送操作的伪代码:

每次从节点$u$推送到节点$v$的流量为$\Delta _{f}(u,v)=min(u.e,c_{f}(u,v))$,保证不会使得$u.e$变为负数,同时超过$c(u,v)$.

如果在一次$PUSH$ 操作后,$(u,v)$达到饱和状态,即$c_{f}(u,v)=0$,那么称此次推送操作为饱和推送,否则为非饱和推送

6 从节点$u$到节点$v$的一个非饱和推送之后,节点$u$将不再溢出。

7 重贴标签操作:如果节点$u$溢出,且对于所有的边$(u,v)\in E_{f}$,有$u.h\leq v.h$,那么此时将进行重贴标签操作$RELABEL(u)$。

这个操作被调用时,$E_{f}$中至少包含一条从$u$出发的边。因为$e(u)=\sum_{v\in V}f(v,u)-\sum_{v\in V}f(u,v)>0$,所以至少有一个$v$使得$(v,u).f>0$,所以至少有一条边$(u,v)\in E_{f}$。

8 算法的整体流程:

(1)初始化

(2)主循环

9 设$f$为流网络G的一个预流,$h$为高度函数。如果一个节点$u$溢出,那么要么可以对$u$进行推送操作,要么可以对$u$进行重贴标签操作。

10 在GENERIC-PUSH-RELABEL的整个过程中,每个节点的高度不会减少,且每次重贴标签操作会使得$u$的高度至少增加1.

11 在GENERIC-PUSH-RELABEL的整个过程中,将始终维持$h$是一个高度函数

12 在GENERIC-PUSH-RELABEL的整个过程中,不存在从源点到汇点的路径。

13 如果GENERIC-PUSH-RELABEL算法能够终止,那么计算出的$f$是一个最大流。

以下为证明

9的证明

对于任意残存边$(u,v)$有$h(u)\leq h(v)+1$。如果不能对$u$进行推送操作,那么对任意的$(u,v)\in E_{f}$有$h(u)<h(v)+1$,即$h(u)\leq h(v)$,因此可以对$u$进行重贴标签操作。

11的证明

(1)初始时,$h$ 是一个高度函数;

(2)重贴标签操作作用于$u$后,对于所有的$(u,v)$仍然满足$h(u)\leq h(v)+1$。对于进入$u$的边,比如$(w,u)$,在重贴标签之前有$w.h\leq u.h+1$,之后有$w.h< u.h+1$。因此重贴标签操作将保持$h$仍然为高度函数。

(3)$PUSH(u,v)$操作之后可能增加一条边$(v,u)$,$v.h=u.h-1<u.h+1$,因此$h$仍然是高度函数。还有可能删掉边$(u,v)$,这没有任何影响。

12的证明

假设存在$p=<v_{0},v_{1},...,v_{k}>$,其中$s=v_{0},t=v_{k}.$由于$p$经过每个节点最多一次,那么有$k<|V|$。由于$h(t)=0$,而对于任意一条边$(v_{i},v_{i+1})$,$v_{i}$的高度最多比$v_{i+1}$的高度达1,,所以$h(s)\leq k<|V|$,这与$h(s)=|V|$矛盾

13的证明

(1)首先,在算法的整个过程中,$f$都是一个预流。初始时是,算法每个循环中,重贴标签不影响$f$,推送操作结束后$f$也仍然是一个预流;

(2)如果算法能够终止,那么终止时,没有节点需要推送操作和重贴标签操作,由9可知,没有溢出节点存在,所以$f$是一个流。由12可知,没有增广路径存在,所以由最大流最小割定理,$f$是最大流

时间: 2024-10-14 02:15:34

最大流学习笔记(3)-推送重贴标签算法一的相关文章

最大流学习笔记(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$是溢出节点,

C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何去推送复杂的数据,以及推送一个实时的图表数据,文本为我原创,转载请注明出处:Richard.Hu,先上一堆乱七八糟的说明先: SignalR的官方地址是: https://www.asp.net/signalr 网上给出例子是一个聊天的例子,官网地址是:https://docs.microsoft.

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

iOS学习之极光推送

一.极光推送工程端 1.下载SDK 极光推送是一个推送消息的第三方,SDK下载:https://www.jpush.cn/common/products 集成压缩包内容:包名为JPush-iOS-SDK-{版本号} lib文件夹:包含头文件 JPUSHService.h,静态库文件jpush-ios-x.x.x.a ,支持的iOS版本为 5.0 及以上版本.(请注意:模拟器不支持APNs) pdf文件:集成指南 demo文件夹:示例 真如上面的介绍,我们在工程中需要 lib 文件夹,因此就只需要

Jelly学习:iOS推送证书的生成(过程中有密码设置,请记住密码)

1.新建一个App ID 2.在钥匙串中生成一个Push.certSigningRequest 3.用App ID和Push.certSigningRequest生成一个Certificate(推送的),然后在钥匙串中导出Certificate生成Push.p12 4.用App ID生成一个Provisioning Profile 5.打开终端: $ openssl x509 -in aps_development.cer -inform DER -outform PEM -out PushCh

Git学习——把文件推送到远程仓库

本地仓库与GitHub仓库关联 git remote add origin [email protected]:<github账户名>/<github的仓库名>.git 把本地库的所有内容推送到远程库上 git push -u origin master //第一次推送master分支 加上-u参数,不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令. 原文地址:htt

HTML5 学习笔记--------》HTML5概要与新增标签!

一.HTML5概要 1.1.为什么需要HTML5 HTML4陈旧不能满足日益发展的互联网需要,特别是移动互联网.为了增强浏览器功能Flash被广泛使用,但安全与稳定堪忧,不适合在移动端使用(耗电.触摸.不开放). HTML5增强了浏览器的原生功能,符合HTML5规范的浏览器功能将更加强大,减少了Web应用对插件的依赖,让用户体验更好,让开发更加方便,另外W3C从推出HTML4.0到5.0之间共经历了17年,HTML的变化很小,这并不符合一个好产品的演进规则. 1.2.什么是HTML5 HTML5

Git 推送和删除标签

事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:refs/tags/目的标签名 git push 文档中有解释: tag <<tag>> means the same as refs/tags/<tag>:refs/tags/<tag>.Pushing an empty <src> allows yo

IO流学习笔记1——File类

Java的IO支持通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流,每种输入.输出流又可以分为字节流和字符流两大类.其中字节流以字节为单位,来处理输入.输出操作,而字符流则以字符来处理输入.输出操作.除此之外,Java的IO流使用了一种装饰器设计模式,它将IO流分成底层节点流和上层处理流,其中节点流用于和底层物理存储节点直接关联--不同物理节点获取节点流的方式可能存在一定的差异,但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入.输