2026/4/18 8:55:16
网站建设
项目流程
保山 网站建设,企业官网模板免费源码,免费国外网站模板,网页版传奇手游迪杰斯特拉#xff08;Dijkstra#xff09;算法和弗洛伊德#xff08;Floyd#xff09;算法是图论中最经典的两种最短路径算法#xff0c;各有其适用场景与实现特点。
1. 迪杰斯特拉算法#xff08;Dijkstra#xff09;——单源最短路径
适用条件#xff1a;图中边权非…迪杰斯特拉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((VE)logV)O(V³)空间复杂度O(V) 或 O(V²)O(V²)是否支持负权边❌ 不支持✅ 支持无负权环适合图类型稀疏图稠密图实现难度中等需维护集合/堆简单三重循环使用最小堆优先队列优化的 Dijkstra 算法可以显著提升性能尤其适用于稀疏图。Python 中可通过heapq模块实现最小堆。✅ 算法步骤堆优化版初始化源点距离为 0其余顶点距离为 ∞。将(距离, 顶点)入堆。循环取堆中距离最小的顶点u若已访问则跳过。遍历u的所有邻接点v尝试通过u松弛v的距离。若找到更短路径则将新距离入堆。直到堆为空。⚠️ 注意同一个顶点可能多次入堆不同路径长度我们只处理第一次出堆最小距离的情况。✅ Python 实现代码邻接表 堆优化importheapqfromcollectionsimportdefaultdictimportmathdefdijkstra_heap(graph,start): 使用最小堆优化的Dijkstra算法求单源最短路径 :param graph: 邻接表格式 {u: [(v, weight), ...]} :param start: 起始顶点 :return: 字典 dist表示从 start 到各点的最短距离 # 初始化距离字典distdefaultdict(lambda:math.inf)dist[start]0# 最小堆(距离, 顶点)heap[(0,start)]visitedset()whileheap:d,uheapq.heappop(heap)# 如果该节点已处理跳过懒删除ifuinvisited:continuevisited.add(u)# 遍历邻居forv,wingraph[u]:ifdwdist[v]:dist[v]dw heapq.heappush(heap,(dist[v],v))returndict(dist)# 示例使用if__name____main__:# 构建图A0, B1, C2, D3graphdefaultdict(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))# 双向边示例distancesdijkstra_heap(graph,0)print(最短距离:,distances)# 输出: {0: 0, 2: 1, 1: 3, 3: 4} 输出说明从节点0出发到0: 0到2: 1到1: 30→2→1到3: 40→2→1→3✅ 时间复杂度分析时间复杂度O((V E) log V)每条边最多入堆一次每次堆操作 O(log V)空间复杂度O(V E)存储图与堆