草稿箱放风2.0。躺了几个月到几年不等的草稿们终于迎来了春天。
之前在《数据结构》的课程、《离散数学》的课程,甚至《计算机图形学》中都接触过图论算法,现在网上搜罗若干经典图论算法,以便后用。
1-3中,待求网络是带权图,所谓的“短”和“小”指的是权值最小。
1. Dijkstra算法
求单源最短路径的算法。即求网络中某个特定点v到网络中其他所有节点的最短路径。
2. Floyd算法
求网络中任意两点间最短路径的算法。
3. Prim算法
求连通图中最小生成树的算法。
最小生成树即由网络中的节点和边组成的树,该树连接了网络中的所有节点。
4. 拓扑排序算法
给有向无环图中的节点排序:若(i,j)是网络中的边,则在排序中i在j的前面。
应用:有向无环图可看成AOV活动网。节点可看作某种活动,边(i,j)表示活动i必须先与活动j进行。如,一个学生选课,数据结构的先修课是计算机基础,那么只有修完计算机基础之后才能修数据结构。拓扑排序相当于给出了一个上课的顺序。
5. 最大流问题
最大流研究的网络用G(V,E,C)表示。其中,V,E,C分别表示节点集合,边集合,以及边的容量集合。
网络的最大流,即在一个单源点,但汇点的网络流中找到一条容量最大的路径。
对于多源点、多汇点的情况:在网络中增加s和t两个点,其中s连接所有源点,t连接所有汇点,连边的权重设为无穷。
6. 最小割问题
割:设网络中一些弧的集合为C。若在网络中去掉C中所有弧能使得从源点s到汇点t的路集为空,称C为s和t间的一个割。
最小割:图中所有割中,边权值和最小的割。
最小割定理:任一网络中,从s到t的最大流的流量等于分离s,t的最小割的容量。
求最大流的算法:Ford-Fulkerson算法。通过寻找增光路径的方法寻找最大流。即,先找到一条可行流,计算其流量。详情参照:https://blog.csdn.net/ivan_zgj/article/details/51580993,http://www.zhiblue.com/xinxi/guangdian/201311/119.html
应用:物流配送规划,二分图匹配问题
7. 最小费用最大流
此问题研究的网络用G(V,E,C,W)表示。其中,V,E,C,W分别表示节点集合,边集合,边的容量集合,以及边的费用。
求出的是,流量v(f)最大的前提下,使流的费用cost(f)最小的路径。
8. 二分图匹配问题:匈牙利算法
可参考:https://blog.csdn.net/m0_37719760/article/details/77607666,https://blog.csdn.net/c20180630/article/details/70175814
给二分图两边的节点两两配对。中心思想是“挪”。将当前节点v和对应的第一个节点s配对,如果另一节点r已经和s配对了,就把r的配对节点换掉,把v配对到s。