图论算法简介(一)

1.网络流

容量网络是一个有向图,图的边 ( u , v ) 有非负的权 c ( u , v ) ,被称为容量。
图中有一个被称为源(只有出边)的节点和一个被称为汇(只有入边)的节点。
实际通过每条边的流量记为 f ( u , v ) 。
残量网络是一个结构和容量网络相同的有向图,只不过边的权值为c ( u , v ) ? f ( u , v ) 。所有边上的流量集合被称为网络流。

在容量网络中,满足以下条件的网络流被称为 可行流。
? 容量限制:
0 ≤ f ( u , v ) ≤ c ( u , v )
? 流量守恒:对于非源汇节点 u ,满足

? 反对称性:f ( u , v ) = ? f ( v , u )

有最大流量的网络流称为 最大流。

给定一个可行流 f={fij}。若 fij = Cij,称<vi, vj>为饱和弧;否则称<vi, vj>为非饱和弧。
若 fij = 0,称<vi, vj>为零流弧;否则称<vi, vj>为非零流弧。
定义一条道路 P,起点是 S、终点是 T。把 P 上所有与 P 方向一致的弧定义为正向弧,正向弧的全体记为 P+;把 P 上所有与 P 方向相悖的弧定义为反向弧,反向弧的全体记为 P-。
譬如在上图中,P = (V1(S), V2, V3, V4(T)),那么
P + = { <V1, V2>, <V3, V4>}
P - = {<V2, V3>}
给定一个可行流 f,P 是从 S到 T的一条道路,如果满足:
Fij是非饱和流,并且<i,j>∈ P+ 或 fij是非零流,并且<i,j>∈ P-
那么就称 P 是 f 的一条可改进路。 (有些书上又称可增广轨)之所以称作“可改进” ,是因为可改进路上弧的流量通过一定的规则修改,可以令整个流量放大。
。如果 A是V的一个子集,A-=V-A,s∈A,t∈A- ,则称边集(A, A- )为网络 N 的一个割,显然,若把某一割的弧从网络中丢去,则从 vs 到 vt 就不存在路。所以直观上讲,割是从 vs 到 vt的必经之道。
给定一割(A, A-),把其中所有弧的容量之和称为这个割的容量,记为 c(A, A- ) ,即:

网络 N中容量最小的割(A* ,A*- )称为 N的最小割。不难证明,任何一个可行流的流量 v(f)都不会超过任一割的容量,即 v(f)≤c(A,A-)。

可行流 f*为最大流,当且仅当不存在关于 f*的增广路径。
最大流最小割定理:在一个网络 N 中,从 vs 到 v t 的最大流的容量等于分离 vs,vt的最小割的容量。

Ford-Fulkerson算法

最大流问题实际上是求一可行流{f ij },使得 v(f)达到最大。
若给了一个可行流 f,只要判断 N 中有无关于 f 的增广路径,如果有增广路径,改进 f,得到一个流量增大的新的可行流;
如果没有增广路径,则得到最大流。

Dinic 算法总是寻找最短的增广路,并沿着它增广。
因为最短增广路在增广过程中始终不会变短。所以无需每次都通过宽度优先搜索寻找最短增广路。我们可以先进行一次宽度优先搜索,然后考虑由近距离顶点指向远距离顶点的边所组成的分层图,在上面进行深度优先搜索寻找最短增广路。
如果在分层图上找不到新的增广路了,则说明最短增广路长度确定变长了,或是不存在增广路了,于是重新通过宽度优先搜索构造新的分层图。每一步构造分层图的复杂度为 O(E) ,而每一步完成之后最短增广路的长度至少增加 1,由于增广路长度不会超过|v|-1,因此最多重复 O(|v|)步就可以了。
另外,在每次对分层图进行深度优先搜索寻找增广路时,如果避免对一条没有用的边进行多次检查(这个优化称作当前弧优化) ,就可以保证复杂度为 O(|E||V|) ,这样总的复杂度就是 O(|E||V|2) 。不过,该算法在实际应用中速度非常快,很多时候即使图的规模比较大也没有问题。

时间: 2024-10-30 15:48:56

图论算法简介(一)的相关文章

基础图论算法导引

ACM中常用图论算法 1. 拓扑排序 -> 拓扑排序的原理及其实现 2. 最短路径算法 -> 最短路算法总结 差分约束系统 -> 差分约束 前k短路 -> 前K短路径问题 3. 最小生成树问题扩展 -> 最?小?生?成?树?问?题?的?拓?展  最优比率生成树 -> 最优比率生成树 最小k度限制生成树 -> IOI2004国家集训队论文,由汪汀所著(网盘内有) 或者刘汝佳的黑书内有 裸题 poj1639 题解 4. 二分图匹配 -> 二分图的最大匹配.完美匹

TF-IDF算法简介

TF-IDF算法全称为term frequency–inverse document frequency.TF就是term frequency的缩写,意为词频.IDF则是inverse document frequency的缩写,意为逆文档频率. 该算法在信息处理中通常用来抽取关键词.比如,对一个文章提取关键词作为搜索词,就可以采用TF-IDF算法. 要找出一篇文章中的关键词,通常的思路就是,就是找到出现次数最多的词.如果某个词很重要,它应该在这篇文章中多次出现.于是,我们进行"词频"

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

AES算法简介

AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES-192或者AE-256. 2.明文密钥组织方式 3.一些相关的的术语定义和表示 • 状态(State):密码运算的中间结果称为状态. • State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb. Nb=分组长度(bits)÷ 32.Nb可以取的值为4,对应的分组长

图论算法之最短路径

图论算法之最短路径 作者:jasonkent27 转载请注明出处:www.cnblogs.com/jasonkent27 1. 前言 1.1 最短路引入 小明和小天现在住在海口(C1),他们俩计划暑假到三亚(C4)玩一趟,在海口和三亚之间有许多中间城市(文昌,临高,乐东,万宁...)图中的边上的数字是他们到达该城市必须的花费,现在需要你帮他们俩找出一条从海口到三亚的最省钱的路径出来. 等等,图中的边的weight怎么会有负的呢?你暂且可以这么理解吧.图中的边上的weight可以当作他们旅途中必须

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发

MD5算法 简介

MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能 l 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹): l 不同的输入得到的不同的结果(唯一性): l 根据128位的输出结果不可能反推出输入的信息(不可逆): MD5用途 1.防止被篡改: 1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a.然后在对方收到电子文档后,对方也得到一个M

算法简介及算法分析

算法简介及算法分析 算法简介 算法的定义: 算法是对特定问题求解步骤的一种描述,是指令的有限序列.(所以说只要满足上述条件,即使很简单的一个循环也是算法) 算法具备5个特征: 输入 输出 有穷性 确定性 可行性 什么是好算法: 正确性 鲁棒性 简单性 抽象分级 高效性 算法分析: 高效性是评价一个算法是否是好算法的重要标准,那么我们怎么判断算法是否高效呢?有的人说,把算法用程序语言实现一下,再输入多个测试数据实际检测运行速度(时间频度)和空间开销就好了呗!这种事后统计的方法并不能准确检测,它牵扯

Java 理论与实践: 非阻塞算法简介--转载

在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保执行 synchronized 块的线程的动作,能够被后来执行受相同锁保护的synchronized 块的其他线程看到.在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路径,而且线程频繁地争用锁的时候,锁定可能成为相当繁重的操作. 在 “流行的原子” 一文中,我们研究了原子