图的基本概念:
图论中的图(
Graph
)是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述些事物之间的某种 特定关系,用点代表事物,用连接两点的线表示相应两个事 物间具有这种关系。
一个图可以用数学语言描述为
G(V(G),E(G))
。
V(vertex)
指 的是图的顶点集,E(edge)
指的是图的边集。 根据边是否有方向,可将图分为有向图和无向图。 另外,有些图的边上还可能有权值,这样的图称为有权图。
在线作图:①
https://csacademy.com/app/graph_editor/
②
求最短路径算法:
①迪杰斯特拉算法
通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 ... 重复该操作,直到遍历完所有顶点。
代码见课件所提供的代码
缺点:无法处理带有负权重的图
修复该缺点就用到了贝尔曼-福德算法:
贝尔曼‐福特算法不支持含有负权回路的图。
负权回路
Matlab计算最短路径:
弗洛伊德算法:计算一个图中任意两点的最短距离
记录最短路径所经过的点伪代码:
Matlab代码见课件所提供 Floyd_algorithm.m
打印指定两点间最短路径 见课件提供代码 print_path.m
打印任意两点间最短路径 见课件提供代码 print_all_path.m