前言
- 本文总结了图论常见的两大问题:单源最短路径、最小生成树
- 涉及方法:Dijkstra算法、Prim算法、Kruskal算法等
- 由于无例子,仅可作为初学者的数模图论问题学习提纲
单源最短路径
简介
- 定义:从图中某个顶点出发,到达另一个顶点所经过的边的权重之和最小的一条路径
- 边带有方向的图是有向图,否则为无向图
- 基本性质:最短路径上的任一子路径也是最短路径(贪心和动态规划的基础 )
- 典型特征:能做出图,从某个起点到某个终点,始终围绕起点到终点的总路径求最优,常常与规划结合
适用赛题
- 货物运输类问题
- 设备更新问题
- 购置新设备需要一笔费用,继续使用旧设备需要维修费且逐年增大
- 在一定年限内,如何安排购置新设备和使用旧设备,使得总支付费用最小
代码求解
- 常用算法:
- Dijkstra算法(迪杰斯特拉算法):基于贪心算法
- Floyd算法:求出所有顶点对之间的最短路径,时间复杂度高
- 基本方法:调用
shortestpath
函数
- 根据题目画出图,写出邻接矩阵,调用函数
shortestpath
求两个单一节点之间的最短路径- 公式:
[path,d]=shortestpath(G,1,6)
-
名称 含义 G 已得的图像 1,6 求第一个点到第六个点的最短路径 path 返回最短路径的依次经过的点 d 返回最短路径的距离
- 设备更新问题的抽象
- 第一年初作为原点
- 最后一年末作为终点
- 每年的选择作为路径
- 总支付费用作为总路径
- 生成图
- 生成无向图:graph。G=graph(A),A是邻接矩阵(无穷项要改成0)
- 生成有向图:digraph
最小生成树
简介
- 连通的无环路的无向图称为树
- 生成树:连通图的一个子图+包含所有顶点+是树
- 最小生成树:生成树+权值之和最小(一个图可能有多个最小生成树)
适用赛题
- 通信建设
- 管道铺设规划
- 辨析:最小生成树是考虑全局的最短,单源最短路径是考虑起点到终点的最短
代码求解
- Prim算法(围绕点)
- 随便从某顶点开始,不断添加权值最小点到树中
- 适合边多点少的图
- Kruskal算法(围绕边)
- 先构造只有顶点的图,按照权重对边排序,不断将不构成回路的边添加到树中
- 适合边少点多的图
- 方法:
- 得邻接矩阵(由于无向只要一个三角,写了1到2就不用写2到1了)
G=graph(a,'upper')
使用a矩阵的上三角构造图形T=minspantree(G,'Method','sparse')
‘Method’,'sparse’可以指定使用Kruskal算法,不写则使用Prim算法L=sum(T.Edges,Weight)
对最小生成树边权重求和