最大流学习笔记(1)

1 流网络。流网络G=(V,E)是一个有向图,每条边$(u,v)\in E$有一个非负容量值$c(u,v)\geq 0$.如果$(u,v)\notin E,c(u,v)=0$.另外有一个源节点s和汇点t。

2 流。G中的流是一个实值函数$f:V\times V\rightarrow R$,满足:

(1)容量限制:对所有的$u,v\in V$,$0 \leq f(u,v)\leq c(u,v)$

(2)流量守恒:对所有的$u\in V-\{s,t\}$,满足$\sum_{v\in V}f(v,u)=\sum_{v\in V}f(u,v)$

一个流$f$的值$|f|$的定义为:$|f|=\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s)$。一般来说,一个流网络不会有任何进入源点的边,因此一般$\sum_{v\in V}f(v,s)=0$。

最大流要解决的问题是给定流网络G以及s、t,希望找到值最大的一个流$f$。

3 残存网络。给定流网络G以及它的一个流$|f|$,残存网络$G_{f}$的顶点集边集以及源点汇点都与原流网络相同,$G_{f}$的边集的容量定义为:

$c_{f}(u,v)=\left\{\begin{matrix}c(u,v)-f(u,v) &(u,v)\in E\\ f(v,u) & (v,u)\in E\\  0 & other \end{matrix}\right.$

4 若求得残存网络$G_{f}$的一个流$f^{‘}$,那么$f+f^{‘}$为$f^{‘}$对$f$的递增,

$(f+f^{‘})(u,v)=\left\{\begin{matrix}f(u,v)+f^{‘}(u,v)-f^{‘}(v,u) & (u,v)\in E\\  0& other \end{matrix}\right.$

$f+f^{‘}$也是G的一个流, $|f+f^{‘}|=|f|+|f^{‘}|$

5 增广路径。对于流网络G和流$|f|$,增广路径$p$是残存网络$G_{f}$的一条从s到t的简单路径。增广路径$p$上能够增加的流量的最大值为$p$的残存容量$c_{f}(p)=min\{c_{f}(u,v):(u,v)\in p\}$.定义函数$f_{p}:V \times V\rightarrow R$:

$f_{p}(u,v)=\left\{\begin{matrix}c_{f}(p) & (u,v)\in p \\ 0 & otherwise \end{matrix}\right.$

$f_{p}$是$G_{f}$的一个流,$|f_{p}|=c_{f}(p)>0$,$|f+f_{p}|=|f|+|f_{p}|>|f|$

6 流网络的切割。流网络G的一个切割$(S,T)$将顶点集合$V$划分为$S$和$T=V-S$,满足$s\in S,t\in T$。若$f$是一个流,那么切割$(S,T)$的净流量$f(S,T)$定义为:

$f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v)-\sum_{u\in S}\sum_{v\in T}f(v,u)$

切割$(S,T)$的容量定义为:$c(S,T)=\sum_{u\in S}\sum_{v\in T}c(u,v)$

4的证明:

(1) $0\leq (f+f^{‘})(u,v) \leq c(u,v)$

有一个前提是$f^{‘}(v,u)\leq c_{f}(u,v)=f(u,v)$

$(f+f^{‘})(u,v)$

$=f(u,v)+f^{‘}(u,v)-f^{‘}(v,u)$

$\geq f(u,v)+f^{‘}(u,v)-f(v,u)$

$=f^{‘}(u,v)\geq 0$

$(f+f^{‘})(u,v)$

$=f(u,v)+f^{‘}(u,v)-f^{‘}(v,u)$

$\leq f(u,v)+f^{‘}(u,v)$

$\leq f(u,v)+c_{f}(u,v)$

$= f(u,v)+c(u,v)-f(u,v)$

$=c(u,v)$

时间: 2024-08-10 14:56:44

最大流学习笔记(1)的相关文章

Java I/O流学习笔记(二)

1. java中有两种类型的流,分别为字节流和字符流.jdk为字节流提供了:InputStream,OutputStream:为字符流提供了Reader以及Writer.    a. 文件在硬盘上的存储方式就是以byte的集合存储的,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘.在读取文件(特别是文本文件)         时,也是一个字节一个字节地读取.    b. 缓冲流,打印流,对象流,文件流,转换流2. 字符流和字节流的区别?   a. 流的概念:在程序中所

java IO流学习笔记

import java.io.*;class hello{ public static void main(String[] args) { System.out.println(File.separator); System.out.println(File.pathSeparator); }}[运行结果]: \ ; String fileName="D:"+File.separator+"hello.txt"; File f=new File(fileName)

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

黑马程序员——JAVA基础-I/O流学习笔记(一)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一次写博文,内心无比激动,成长在此开始! 最近一直在自学java基础,看到I/O流这章了,先写下对I/O流的了解吧! 一.I/O流简介 I/O是实现java编程输入和输出的基础,可以方便的将数据进行输入/输出操作.java把不同的输入/输出源(硬盘.文件.网络连接等)抽象的描述成“流”,由于流的存在,实现了不同输入/输出源之间的交换数据. java中关于流的操作的类都在java.io包中.

IO流学习笔记3——字节流和字符流的输入/输出

字节流和字符流的操作方式基本一样,区别只是操作的数据单元有区别:字节流操作的数据单元是字节,字符流操作的数据单元字符. InputStream和Reader是所有输入流的基类,它们两个都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流. OutputStream和Writer是所有输出流的基类,和输入流相似,也有对应的输出流:FileOutputStream和FileWriter,它们也是节点流. 1.使用Fi

最大流学习笔记(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\rightarro

最大流学习笔记(2)

1 基本的Ford-Fulkerson方法.该方法的思想就是每次找到一个增广路$p$,然后将增广路 $p$对应的流加到之前的流上得到新的流,一直这样直到找不到增广路,这时候找到的流就是最大流. 算法的伪代码如下 假设容量是整数,最大流为$f^{*}$,那么while循环最多执行$|f^{*}|$次,因为每次至少使得流量增加1,每次找增光路的代价是$O(E)$,所以总的复杂度是$O(E|f^{*}|)$ 2 Edmonds-Karp算法.Edmonds-Karp算法是对Ford-Fulkerson

IO流学习笔记1——File类

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

Python基础教程 第11章: 文件和流 学习笔记

本文部分内容转载于: http://www.runoob.com/python/python-files-io.html http://docs.pythontab.com/python/python2.7/inputoutput.html#tut-files 打开文件: 你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的辅助方法才可以调用它进行读写.语法: file object = open(file_name [, access_mode][, buff