小白算法学习 网络流
来源:互联网 发布:知豆电动汽车电池价格 编辑:程序博客网 时间:2024/06/03 09:10
这里还有两篇很好的关于网络流的博文 : A 点击打开链接 B: 点击打开链接
网络流
一:what is 网络流???
根据lsr_dalao的ppt上所言:
定义: 图论中的一种理论与方法,研究网络上的一类最优化问题 。 。
很多系统中涉及流量问题,例如公路系统中车流量,网络中的数据信息流,供油管道的油流量等。我们可以将有向图进一步理解为“流网络”(flow network),并利用这样的抽象模型求解有关流量的问题
显然我是有点没看懂的,那我就用人类听得懂的话来讲讲吧。比如我们有一个交通网络如下图
有点丑,不过忍受一下就好。QAQ。我们假设1点是长沙,5点是北京,2,3,4分别是武汉,郑州,石家庄,假设我们是坐火车北上,长沙到武汉的火车上只能坐两个人(以此类推),中途不换程,不下车,从长沙出发的雅礼同学们只有多少能到北京呢?很显然,是4个人。
如下图:
蓝色的数字代表火车上最多有几个人,为什么1->3是0?因为我们要求的是最大的人数,嗯,就是这样。
二:介绍下网络流最大流的方法及代码
依旧先引用lsr_dalao的ppt中话
1.简介 求解网络流的基本思想就是每次寻找增广路(就是源点到汇点的一条可行路)然后ans+=增广路能流过的流量,更新剩余网络,然后再做增广路,直到做不出增广路。关于网络流入门最难理解的地方就是剩余网络了....为什么在找到一条增广路后...不仅要将每条边的可行流量减去增广路能流过的流量...还要将每条边的反向弧加上增广路能流过的流量.?..原因是在做增广路时可能会阻塞后面的增广路...或者说做增广路本来是有个顺序才能找完最大流的.....但我们是任意找的...为了修正...就每次将流量加在了反向弧上...让后面的流能够进行自我调整...剩余网络的更新(就在原图上更新就可以了)(what?speak earth language!)反正我是没看懂的……..若有大神围观勿喷。
接下来蒟蒻给你们讲讲网络流最大流最简单也是最慢的一种EK算法:
我们设刚刚那个啥交通网络为图G,这个图是个有向图,不然做不了,记住这句话,后面有题目。定义c函数为管道容量大小,就是火车上最多坐多少个人,f函数为管道的流量,就是火车身上现在做了几个人。
显然c函数要大于等于f函数的大小(不多说,水流多了管子会爆,其次,这是中国,不是印度,还是不能坐火车顶上的)。这是图G的三个性质之一:容量限制,然后有个反对称性,就是流过去的f = 流回来的-f,现在不懂没事,一会讲反向边的时候细讲,第三个就是流守恒性,就是从源点出发的总流量等于到汇点的总流量,就是从长沙出发的雅礼大佬们不能在火车上失踪了。
明白了这些,我现在来讲网络流中最难理解东西:反向边
来个经典的图:
还是很丑,嗯,有向图吧,不多说了,初始是0号节点流向一号节点和四号节点(未画出)1->2->5->6->7流量都是10,我们假设这条路径上都是满流,就是c = f 就是不能再流其他的流了,然后我们设定其他边上也是c = 10,4->5也有5的流量,如果按照EK算法中的bfs来说,为了找到一个最大流,2->3这条边都不会走,可能一开始找瓶颈把4,5入队,但是后面不断调整流量时,流量回被调成10,毕竟程序是为了寻找最大流,所以说如果不把流过的边加上一个反向边4->5这个流量都不会被加入增广路,可能你还是没怎么理解,我先来介绍下残量网络,这样你会理解的更深。
红色的数字代表回流的量,2->3那条边我先暂时不标,在残留网络的中如果
现在我们再来讲讲反相边到底是用来干嘛的,你看,如果给2->5加一条反相边,是不是4可以通过反相边到达汇点7,而原来的图是不行的因为5,6这条边已经满流,所以说,如果不加反相边,会有一条路都找不到,那不就很尴尬了,^_^。
换句话说,加条反相边那就是给程序一个反悔的机会,现实中,反相边是不存在的,只是在程序中出现,实际上,这就相当于4->5的流量转给2->3,第一条路变成1,2,3,7,第二条路变成4,5,6,7,所以,是不是更好理解了呢?
接下来,我来讲讲EK的代码。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
嗯,EK,还是很简单的,接下来我们讲讲dinic。
dinik是啥捏,就是比EK快的算法,跟二分图匹配里的hk算法很像。dinic用到了一个深度标号,是bfs求得的,根据bfs的性质,标号大小是按距离远近严格递增的,搜索树中同一层的为同一标号,如图,蓝色数字为深度标号:
很形象是吧,bfs都不会的话,那还是先别碰网络流,然后我们按照深度标号严格递增或递减(看是从源点还是汇点出发)用dfs搜索,然后就好了。那为什么?因为之前讲反向边的时候我将讲过,实际上1到5的路径中,我们现实中肉眼观察只有1,2,5,和1,3,5这两条边中间的边是不会流的,因为时加入的反向边,时间上不存在,如是我们就可以按照标号严格递增或递减来进行搜素,然后松弛即可。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
三:费用流
这里只讲最小费用流,只是讲EK中的bfs换成了spfa,因为网络中的每条边有了个费用。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 小白算法学习 网络流
- poj 1273-小白算法练习 Drainage Ditches 网络流
- 小白算法学习 KMP
- 小白算法学习 博弈论
- 开始网络流算法学习
- 扩展欧几里得 小白算法学习
- 树状数组 小白算法学习
- POJ 小白算法学习 任重而道远
- 网络流之SAP算法学习
- 网络流之SAP算法学习
- 网络流基础学习(Edmonds_Karp算法 )
- 网络流之SAP算法学习
- 【网络流】网络流学习笔记Part2ISAP算法
- 小白算法学习 二分图 匈牙利算法
- 小白算法学习 二分图 匈牙利算法
- iOS开发小白学习体验-7-网络请求
- WS小世界网络模型构造算法
- 机器学习算法----贝叶斯网络
- 二分法查找
- CTreeCtrl基本使用
- poj1318 用string.sort代码简明
- java基础之循环
- 北大方正多元化的悲惨结局
- 小白算法学习 网络流
- jsp语法,指令,动作元素,内置对象
- java基础之方法
- 以人为本的机器学习:谷歌人工智能产品设计概述 By 机器之心2017年7月17日 12:13 取代了手动编程,机器学习(ML)是一种帮助计算机发现数据中的模式和关系的科学。对于创建个人的和动态的经历
- iso to usb(iso写入u盘工具) v3.0 绿色版
- MacOS中Safari地址栏卡顿以及经常自动跳转到MacKeeper站点的解决
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
- 异常:java.security.InvalidKeyException: Illegal key size or default parameters
- java: -source 1.5 中不支持 multi-catch 运算符 (请使用 -source 7 或更高版本以启用 multi-catch 运算符)