news 2026/7/19 7:52:54

数据结构之最短路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构之最短路径

1、迪杰斯特拉算法(Dijkstra Algorithm)

迪杰斯特拉算法是⼀个单源点的⼀个最短路径算法,也就是说,我们这个算法会求得从⼀个顶点到其所有顶点的最短路径。
迪杰斯特拉算法可以计算指定顶点到其他顶点之间的最短路径,那么我就可以通过指定网络中的每⼀个顶点为源点,重复执⾏迪杰斯特拉算法 n 次,这样便可以得到每⼀对顶点之间的最短路径,这种方式的时间复杂度为O(n^3) 。

#include<iostream>#include<vector>#include<climits>usingnamespacestd;constintINF=INT_MAX/2;// 防止加法溢出// 单源Dijkstra:start为源点,返回start到所有点的最短路vector<int>dijkstraSingle(constvector<vector<int>>&graph,intn,intstart){vector<int>dist(n,INF);vector<bool>vis(n,false);dist[start]=0;for(inti=0;i<n;++i){// 1. 找未访问、距离最小的点uintu=-1;intminVal=INF;for(intj=0;j<n;++j){if(!vis[j]&&dist[j]<minVal){minVal=dist[j];u=j;}}if(u==-1)break;vis[u]=true;// 2. 松弛更新for(intv=0;v<n;++v){if(!vis[v]&&graph[u][v]!=INF){if(dist[v]>dist[u]+graph[u][v]){dist[v]=dist[u]+graph[u][v];}}}}returndist;}// 对每个顶点执行一次Dijkstra,得到全点对最短路矩阵vector<vector<int>>dijkstraAllPair(constvector<vector<int>>&graph,intn){vector<vector<int>>res;for(ints=0;s<n;++s){res.push_back(dijkstraSingle(graph,n,s));}returnres;}intmain(){// 4个顶点邻接矩阵intn=4;vector<vector<int>>graph={{0,2,INF,6},{INF,0,3,INF},{INF,INF,0,1},{INF,INF,INF,0}};vector<vector<int>>allDist=dijkstraAllPair(graph,n);cout<<"===== 多次Dijkstra 全源最短路径矩阵 ====="<<endl;for(auto&row:allDist){for(intx:row){if(x>=INF)cout<<"∞ ";elsecout<<x<<" ";}cout<<endl;}return0;}

2、弗洛伊德算法(Floyd Algorithm)

弗洛伊德算法是全源点最短路径算法,也就是说,该算法单次运行就能直接求出图中任意一对顶点之间的最短路径,不需要多次重复执行算法。
弗洛伊德算法不需要单独指定源点,而是以整个图的邻接距离矩阵为基础,依次把网络中每一个顶点 k 当作中转中间点,循环执行松弛操作:对任意起点 i、终点 j,判断路径 i→k→j 是否比当前 i→j 的直接路径更短,若更短就更新两点间最短距离;完整遍历全部 n 个顶点作为中转点后,矩阵内 i 行 j 列的值就是顶点 i 到顶点 j 的最短路径,仅需一轮三层循环即可得到每一对顶点之间的最短路径,这种方式的时间复杂度同样为 (O(n^3))。

#include<iostream>#include<vector>#include<climits>usingnamespacestd;constintINF=INT_MAX/2;vector<vector<int>>floyd(constvector<vector<int>>&graph,intn){// 复制邻接矩阵为距离矩阵vector<vector<int>>dist=graph;// k:中转点 i起点 j终点for(intk=0;k<n;++k)for(inti=0;i<n;++i)for(intj=0;j<n;++j){if(dist[i][k]!=INF&&dist[k][j]!=INF){dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);}}returndist;}intmain(){intn=4;vector<vector<int>>graph={{0,2,INF,6},{INF,0,3,INF},{INF,INF,0,1},{INF,INF,INF,0}};vector<vector<int>>dist=floyd(graph,n);cout<<"\n===== Floyd弗洛伊德 全源最短路径矩阵 ====="<<endl;for(auto&row:dist){for(intx:row){if(x>=INF)cout<<"∞ ";elsecout<<x<<" ";}cout<<endl;}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 7:51:06

Android APK打包全流程与优化技巧详解

1. Android APK打包基础概念解析在Android开发领域&#xff0c;APK&#xff08;Android Package Kit&#xff09;是Android操作系统使用的应用程序包文件格式。它包含了编译后的代码、资源文件、清单文件以及证书等所有运行应用所需的组件。对于开发者而言&#xff0c;掌握APK打…

作者头像 李华
网站建设 2026/7/19 7:48:54

AM62L CBASS防火墙实战:从寄存器配置到内存安全策略部署

1. 从寄存器手册到实战&#xff1a;理解AM62L CBASS防火墙的底层逻辑如果你正在基于德州仪器&#xff08;TI&#xff09;的AM62L Sitara™处理器开发产品&#xff0c;尤其是在汽车电子、工业自动化或任何对功能安全和信息安全有要求的领域&#xff0c;那么你迟早会与一个名为CB…

作者头像 李华
网站建设 2026/7/19 7:46:28

AM62L SoC CBASS防火墙配置实战:从硬件隔离原理到嵌入式安全设计

1. CBASS防火墙在AM62L SoC中的核心作用与设计哲学 在嵌入式系统&#xff0c;尤其是像TI AM62L这样的高性能异构多核处理器中&#xff0c;系统安全不再是软件层面的“附加题”&#xff0c;而是硬件设计之初就必须考虑的“必答题”。我接触过不少项目&#xff0c;初期为了赶进度…

作者头像 李华
网站建设 2026/7/19 7:43:50

深入解析GPMC预取与写后置引擎:提升嵌入式存储性能的关键技术

1. 项目概述&#xff1a;GPMC预取与写后置引擎的核心价值在嵌入式系统开发中&#xff0c;尤其是涉及大量数据存储与交换的场景&#xff0c;处理器与外部存储设备&#xff08;如NAND闪存&#xff09;之间的数据通道往往是性能瓶颈的关键所在。如果你曾为NAND闪存缓慢的随机读写速…

作者头像 李华
网站建设 2026/7/19 7:42:47

XUtils3框架:Android开发四大核心模块实战指南

1. XUtils3 框架概述与环境搭建必要性 XUtils3 是 Android 平台上一款轻量级开源工具库&#xff0c;它整合了四大核心功能模块&#xff1a;数据库操作&#xff08;DbUtils&#xff09;、网络请求&#xff08;HttpUtils&#xff09;、图片加载&#xff08;BitmapUtils&#xff0…

作者头像 李华
网站建设 2026/7/19 7:42:30

深入解析I2C总线协议与AM62L处理器驱动开发实战

1. 项目概述与I2C协议核心价值在嵌入式系统开发中&#xff0c;如何让一个主控芯片高效、可靠地与多个外围芯片“对话”&#xff0c;一直是个既基础又关键的课题。早年&#xff0c;我们可能需要为每个外设分配独立的并行数据线和控制线&#xff0c;这不仅让PCB布线变得复杂&…

作者头像 李华