数学建模图论算法学习总结
图论基本知识
B站视频:
https://www.bilibili.com/video/av18374161/?p=35
https://www.bilibili.com/video/av37498689/?p=7
图论中的圈与块:
https://wenku.baidu.com/view/44777a20a5e9856a5612604a.html
一、Dijkstra& Floyd求解最短路径
1.1 Dijkstra (MATLAB C#)
采用贪心算法(Greedy Algorithm)范式进行设计
B站MATLAB实现:https://www.bilibili.com/video/av20238704/?p=6
C#实现:https://www.cnblogs.com/mingjiatang/p/5974451.html
1.2 Floyd (MATLAB) Bellman-Ford
用于计算带权有向图中单源最短路径。
采用动态规划(Dynamic Programming)进行设计

B站MATLAB实现:https://www.bilibili.com/video/av20238704/?p=6
总结:到问题,转化为带权邻接矩阵,然后输入程序。数学建模时可以用不同算法比较分析,更有说服力。
二、Kruskal& Prim求解最小生成树
B站视频,讲的特别好!
https://www.bilibili.com/video/av47042691?from=search&seid=4115249733910833698
2.1最小生成树
生成树:
i. 不能有环
ii. 必须连接图中的全部顶点
所以最小生成树的任意两个顶点之间可以连通,对于有N个顶点的树,其边的个数为N-1。
最小生成树:
对于一个图,可以有很多生成树,边的权值相加最小的就是最小生成树。
应用:
如几个城市之间铺设光缆,按最小生成树铺设,就可以实现几个城市之间都能连通,所需成本又最小。
2.2 Kruskal
上面B站视频截图:
算法思想:
i. 把图中所有边按权值从小到大排列。
ii. 每次选择权值最小的边放入图中。如果没有形成环,那么这条边就是最小生成树中的一条边,否则,丢弃它,继续选择剩下的最小的边尝试。
iii. 直到选择了N-1条边,结束。
C语言实现:
https://www.cnblogs.com/skywang12345/p/3711496.html
2.3 Prim
上面B站视频截图:
算法思想:
i. 从一个顶点开始,选择与该顶点相连的权值最小的边,将这条边的另一个顶点纳入已选集合。
ii. 找出已选集合所有顶点和未选集合所有顶点之间的相连的权值最小的边,将该边和与其相连的顶点加入已选集合。
iii. 循环ii,结束。
实现:(有很多,网上搜)
https://www.cnblogs.com/ITgaozy/p/5198119.html
https://cloud.tencent.com/developer/article/1051931
三、最大流
管道网络中每条边的最大通过能力(容量)是有限的,实际流量不超过容量。
最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。
基本概念:
https://baike.baidu.com/item/最大流问题/19144252?fr=aladdin
算法:FF算法、EK算法、dinic算法
https://blog.csdn.net/qq_41357771/article/details/79416899
EK算法:BFS找增广路
https://www.bilibili.com/video/av18567992/?p=1
dinic算法
https://www.bilibili.com/video/av18800207?from=search&seid=15254823874702529609
四、二分匹配,匈牙利算法
https://www.bilibili.com/video/av16362938?from=search&seid=12661245930214840970
二分图
找增广路