图论最短路径问题(清风建模学习笔记)

图的基本概念:

图论中的图( 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  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值