news 2026/6/10 14:39:16

迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法是图论中最经典的两种最短路径算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法是图论中最经典的两种最短路径算法

迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法是图论中最经典的两种最短路径算法,各有其适用场景与实现特点。

1. 迪杰斯特拉算法(Dijkstra)——单源最短路径

  • 适用条件:图中边权非负(不能有负权边),适合稀疏图。
  • 核心思想
    • 维护一个距离数组dist[],表示从源点到各顶点的当前最短距离。
    • 使用集合 S 记录已确定最短路径的顶点,T 表示未确定的顶点。
    • 每次选择 T 中dist最小的顶点 u,将其加入 S,并以 u 为中间点松弛其邻接点的距离(即尝试通过 u 改善其他点的距离)。
  • 时间复杂度
    • 使用邻接矩阵:O(V²)
    • 使用优先队列(堆优化):O((V + E) log V),适合稀疏图
  • 不能处理负权边,因为一旦某个点被标记为“已确定”,就不会再更新,而负权边可能导致后续更短路径出现。

2. 弗洛伊德算法(Floyd)——所有顶点对之间的最短路径

  • 适用条件:允许负权边,但不能有负权环;适合稠密图。
  • 核心思想
    • 基于动态规划,使用三维状态思想但在二维数组上迭代。
    • 初始时用邻接矩阵dis[i][j]存储直接边权或 ∞。
    • 枚举中间点 k(从 1 到 n),更新所有点对 (i, j) 的距离:
      ifdis[i][k]+dis[k][j]<dis[i][j]:dis[i][j]=dis[i][k]+dis[k][j]
    • 经过 n 轮后,dis[i][j]即为 i 到 j 的最短路径。
  • 时间复杂度:O(V³),空间复杂度 O(V²)
  • 优点:代码简洁,易于实现,能检测负权环(只需检查对角线是否有负值)

总结对比:

特性DijkstraFloyd
解决问题单源最短路径所有顶点对最短路径
时间复杂度O(V²) 或 O((V+E)logV)O(V³)
空间复杂度O(V) 或 O(V²)O(V²)
是否支持负权边❌ 不支持✅ 支持(无负权环)
适合图类型稀疏图稠密图
实现难度中等(需维护集合/堆)简单(三重循环)

使用最小堆(优先队列)优化的 Dijkstra 算法可以显著提升性能,尤其适用于稀疏图。Python 中可通过heapq模块实现最小堆。

✅ 算法步骤(堆优化版):

  1. 初始化源点距离为 0,其余顶点距离为 ∞。
  2. (距离, 顶点)入堆。
  3. 循环取堆中距离最小的顶点u,若已访问则跳过。
  4. 遍历u的所有邻接点v,尝试通过u松弛v的距离。
  5. 若找到更短路径,则将新距离入堆。
  6. 直到堆为空。

⚠️ 注意:同一个顶点可能多次入堆(不同路径长度),我们只处理第一次出堆(最小距离)的情况。


✅ Python 实现代码(邻接表 + 堆优化)

importheapqfromcollectionsimportdefaultdictimportmathdefdijkstra_heap(graph,start):""" 使用最小堆优化的Dijkstra算法求单源最短路径 :param graph: 邻接表,格式 {u: [(v, weight), ...]} :param start: 起始顶点 :return: 字典 dist,表示从 start 到各点的最短距离 """# 初始化距离字典dist=defaultdict(lambda:math.inf)dist[start]=0# 最小堆:(距离, 顶点)heap=[(0,start)]visited=set()whileheap:d,u=heapq.heappop(heap)# 如果该节点已处理,跳过(懒删除)ifuinvisited:continuevisited.add(u)# 遍历邻居forv,wingraph[u]:ifd+w<dist[v]:dist[v]=d+w heapq.heappush(heap,(dist[v],v))returndict(dist)# 示例使用if__name__=="__main__":# 构建图:A=0, B=1, C=2, D=3graph=defaultdict(list)graph[0].append((1,4))graph[0].append((2,1))graph[1].append((3,1))graph[2].append((1,2))graph[2].append((3,5))graph[1].append((2,1))# 双向边示例distances=dijkstra_heap(graph,0)print("最短距离:",distances)# 输出: {0: 0, 2: 1, 1: 3, 3: 4}

🔍 输出说明:

  • 从节点0出发:
    • 0: 0
    • 2: 1
    • 1: 3(0→2→1)
    • 3: 4(0→2→1→3)

✅ 时间复杂度分析:

  • 时间复杂度:O((V + E) log V),每条边最多入堆一次,每次堆操作 O(log V)
  • 空间复杂度:O(V + E),存储图与堆

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 7:48:07

Sonic模型License协议解读:可商用但需署名

Sonic模型License协议解读&#xff1a;可商用但需署名 在AIGC内容创作门槛不断降低的今天&#xff0c;如何用最低成本生成高质量数字人视频&#xff0c;已成为短视频、在线教育、虚拟主播等领域的核心命题。传统方案依赖昂贵的3D建模与动作捕捉&#xff0c;而新兴AI模型则试图以…

作者头像 李华
网站建设 2026/6/10 1:51:33

Sonic数字人监控指标设计:GPU利用率、请求成功率等

Sonic数字人监控指标设计&#xff1a;GPU利用率、请求成功率等 在虚拟主播24小时不间断直播、电商带货视频批量生成的今天&#xff0c;一个“嘴型对不上发音”或频繁失败的数字人系统&#xff0c;足以让用户瞬间出戏。而腾讯与浙大联合研发的Sonic模型&#xff0c;正试图解决这…

作者头像 李华
网站建设 2026/6/10 14:13:44

超详细版4位ALU设计:从逻辑门到完整电路搭建

从零搭建一个4位ALU&#xff1a;深入理解CPU的“计算大脑”你有没有想过&#xff0c;当你在代码里写下a b的那一刻&#xff0c;计算机底层究竟发生了什么&#xff1f;这个看似简单的加法操作&#xff0c;其实是由一个名为算术逻辑单元&#xff08;ALU&#xff09;的硬件模块在…

作者头像 李华
网站建设 2026/6/10 14:13:26

联合国儿童基金会UNICEF试用Sonic进行童权教育

联合国儿童基金会UNICEF试用Sonic进行童权教育&#xff1a;基于轻量级数字人同步模型的技术解析 在非洲某偏远社区的教室里&#xff0c;一段由本地女性形象“出镜”的动画视频正在播放&#xff0c;她用斯瓦希里语娓娓讲述儿童受保护的权利。孩子们专注地看着屏幕&#xff0c;仿…

作者头像 李华
网站建设 2026/6/10 6:32:06

大数据领域数据预处理的创新实践

大数据领域数据预处理的创新实践&#xff1a;突破瓶颈&#xff0c;释放数据潜能 一、 引言&#xff1a;数据洪流下的"暗礁"—— 预处理的生死时速 “在数据仓库里躺着的PB级日志&#xff0c;为什么永远无法驱动精准的用户画像&#xff1f;” “当我们投入百万构建的…

作者头像 李华
网站建设 2026/6/9 22:23:08

抖音挑战赛策划:拍摄Sonic生成视频参与热门挑战

抖音挑战赛策划&#xff1a;用Sonic生成数字人视频玩转热门挑战 你有没有刷到过这样的视频——一个人站在镜头前&#xff0c;字正腔圆地讲着段子&#xff0c;表情自然、口型精准&#xff0c;可实际上这根本不是真人出镜&#xff1f;背后可能正是AI数字人在“说话”。如今在抖音…

作者头像 李华