当前位置: 首页 > news >正文

图论与最短路学习笔记

图论与最短路在数学建模中的应用

一、图论模型

  • G=(V,E)G=(V,E)G=(V,E)

    • VVV:顶点集合
    • EEE:边集合
  • 每条边 (u,v)(u,v)(u,v) 赋予权值 w(u,v)w(u,v)w(u,v),可用 邻接矩阵邻接表 表示。

二、最短路问题的数学形式

目标:寻找从源点 sss 到目标点 ttt 的路径 PPP,使得路径权值和最小。

d(s,t)=min⁡P∈P(s,t)∑(u,v)∈Pw(u,v) d(s,t) = \min_{P \in \mathcal{P}(s,t)} \sum_{(u,v)\in P} w(u,v) d(s,t)=PP(s,t)min(u,v)Pw(u,v)

其中:

  • P(s,t)\mathcal{P}(s,t)P(s,t):所有从 sssttt 的可行路径集合
  • w(u,v)w(u,v)w(u,v):边的权值

三、最短路算法

  1. Dijkstra 算法

    • 适用于 非负权图
    • 贪心策略:逐步扩展源点集合,选取最近节点
  2. Bellman-Ford 算法

    • 允许 负权边

    • 动态规划思想:

      dk(v)=min⁡{dk−1(v),min⁡(u,v)∈E(dk−1(u)+w(u,v))} d_k(v) = \min\{ d_{k-1}(v), \min_{(u,v)\in E} (d_{k-1}(u)+w(u,v)) \} dk(v)=min{dk1(v),(u,v)Emin(dk1(u)+w(u,v))}

    • 可检测负环

  3. Floyd-Warshall 算法

    • 适合 全源最短路

    • 递推公式:

      d(k)(i,j)=min⁡(d(k−1)(i,j), d(k−1)(i,k)+d(k−1)(k,j)) d^{(k)}(i,j) = \min\big( d^{(k-1)}(i,j),\ d^{(k-1)}(i,k)+d^{(k-1)}(k,j) \big) d(k)(i,j)=min(d(k1)(i,j), d(k1)(i,k)+d(k1)(k,j))

四、MATLAB 实现

1. Dijkstra 算法

INF = 1e9;
G = [0 4 2 INF INF;4 0 1 5 INF;2 1 0 8 10;INF 5 8 0 2;INF INF 10 2 0];n = size(G,1);
start = 1;
dist = ones(1,n)*INF;
visited = zeros(1,n);
dist(start) = 0;for i = 1:n[~, u] = min(dist + visited*INF);visited(u) = 1;for v = 1:nif ~visited(v) && dist(u)+G(u,v) < dist(v)dist(v) = dist(u)+G(u,v);endend
enddisp('Dijkstra: 起点到各点的最短距离:');
disp(dist);

2. Bellman-Ford 算法

INF = 1e9;
edges = [1 2 4;1 3 2;2 3 1;2 4 5;3 2 1;3 4 8;3 5 10;4 5 2];n = 5;   % 节点数
m = size(edges,1);
start = 1;
dist = ones(1,n)*INF;
dist(start) = 0;% 松弛操作 n-1 次
for k = 1:n-1for i = 1:mu = edges(i,1);v = edges(i,2);w = edges(i,3);if dist(u) + w < dist(v)dist(v) = dist(u) + w;endend
end% 检测负环
hasNegativeCycle = false;
for i = 1:mu = edges(i,1);v = edges(i,2);w = edges(i,3);if dist(u) + w < dist(v)hasNegativeCycle = true;end
enddisp('Bellman-Ford: 起点到各点的最短距离:');
disp(dist);
if hasNegativeCycledisp('图中存在负权回路!');
end

3. Floyd-Warshall 算法

INF = 1e9;
G = [0 4 2 INF INF;4 0 1 5 INF;2 1 0 8 10;INF 5 8 0 2;INF INF 10 2 0];n = size(G,1);for k = 1:nfor i = 1:nfor j = 1:nif G(i,k)+G(k,j) < G(i,j)G(i,j) = G(i,k)+G(k,j);endendend
enddisp('Floyd-Warshall: 所有点对最短路径矩阵:');
disp(G);

五、总结

  • 建模方法:用图表示系统,用边权表示代价

  • 最短路问题目标:找到权和最小路径

  • 算法选择

    • 单源非负权:Dijkstra
    • 单源含负权:Bellman-Ford
    • 全源最短路:Floyd-Warshall
http://www.xdnf.cn/news/1353277.html

相关文章:

  • 【数据结构】跳表的概率模型详解与其 C 代码实现
  • 深度学习开篇
  • `strlen` 字符串长度函数
  • python 字典有序性的实现和OrderedDict
  • 计算机网络 各版本TLS握手的详细过程
  • 电脑零广告快响应提速(一)之卸载搜狗输入法使用RIME—东方仙盟
  • python re模块常用方法
  • MySQL详细介绍指南
  • 蓝牙aoa仓库管理系统功能介绍
  • [e3nn] 归一化 | BatchNorm normalize2mom
  • 【技术突破】动态目标误检率↓83.5%!陌讯多模态融合算法在智慧城管的实战优化
  • 基于电力电子变压器的高压脉冲电源方案复现
  • 使用 Certbot 申请 Apache 证书配置棘手问题
  • 【数据结构】计数排序:有时比快排还快的整数排序法
  • Ubuntu 操作系统深度解析:从入门到精通(2025 最新版)
  • Java JVM 超级详细指南
  • 在Linux环境中为Jupyter Lab安装Node.js环境
  • 云计算之云主机Linux是什么?有何配置?如何选?
  • JavaSpring+mybatis+Lombok,实现java架构[保姆教程]
  • Linux PCI 子系统:工作原理与实现机制深度分析
  • Bartender 5 Mac 多功能菜单栏管理
  • 【LeetCode】85. 最大矩形 (暴力枚举)
  • 嵌入式软件/硬件工程师面试题集
  • MySql知识梳理之DDL语句
  • 力扣hot100:搜索二维矩阵与在排序数组中查找元素的第一个和最后一个位置(74,34)
  • 知识蒸馏 Knowledge Distillation 概率链式法则(Probability Chain Rule)
  • Java接口响应速度优化
  • springboot项目结构
  • leetcode80:删除有序数组中的重复项 II(快慢指针法)
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(6):51-60语法