最大流最小割问题
最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。
在一个连通图中,如果删掉若干条边,使图不联通,则称这些边为此图的一个割集。在这些割集中流量和最小的一个称为最小割。
最大流最小割定理:一个图的最大流等于最小割。
见:https://www.jianshu.com/p/efb2d79e2b0f
概念:
1、容量网络 - 流量网络 = 残留网络
例如:
这是一个容量网络(就是每条管道能流多少水)。他的一种可能的流量走向:
每条边只看斜杠左侧的数值,这些数值构成了流量网络。而残留网络就是每条边斜杠右侧减去斜杠左侧的值得到的网络。其中在残留网络中,S2->S4、S5->S4、S5->S6这些边都不存在了。在最终的残留网络中,是找不到S1->S6的新的增广路径的。
2、反向边
见https://www.jianshu.com/p/efb2d79e2b0f的反向边部分。
1、Ford-Fulkerson算法
缺点:由于增广路经的选择的任意性,导致该算法的时间复杂度不仅依赖于网络规模,还与各边的容量有关。
2、Edmonds-Karp修正算法
"先标号的先扫描"。对已给标号的顶点进行扫描时,先对所有和邻接的未给标号的顶点给予标号。
优点:相对于Ford-Fulkerson算法,其使得流量的增加总是沿着一条长度最短的路径进行流向的。
缺点:时间复杂度相对于标号法减少了,但仍然有很大的时间复杂度。
3、Dinic算法
Dinic算法是标号法的改进算法。Dinic算法兼取以上两种算法,在分层时使用广度优先算法,在寻找增广路径的时候,则采取深度优先策略。是目前三种算法中最高效的一个。
最小费用最大流
第二种办法与前文的 Ford-fulkerson 方法很像,所以选择它更方便,如何找到费用最小的增链流呢?可以用最短路径算法,这里是单源最短路径,所以选择 Dijkstra 算法找出最短路径即可。见:https://github.com/edisonleolhl/DataStructure-Algorithm/blob/master/Graph/MaxFlow/mincostmaxflow.py
最大二分匹配
见:https://blog.csdn.net/smartxxyx/article/details/9672181
其他更深层次的理解见https://blog.csdn.net/smartxxyx/article/details/9275177 这个博友写的系列教程。
图的遍历
深度优先遍历dfs、广度优先遍历bfs。
最短路径算法
需要指定出发点
Dijkstra算法
参见: https://blog.csdn.net/qq_39521554/article/details/79333690
此算法使用了一种'松弛'的思想。算法的结果会把出发点到其他点的所有最短距离都计算出来。
最小生成树
1、Prime算法
算法思想:
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>(这一步是对Vnew中的点都要进行比较),其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。
2、Kruskal算法
Hungarian Algorithm
最大流算法(用于求二分图最大匹配的时候)的一种改进,用于求最大匹配问题或者指派问题,见:https://blog.csdn.net/u011837761/article/details/52058703
WelshPowell染色算法
不知道怎么用。