1. 项目概述
今天要分享的是我在算法学习过程中整理的图论专题笔记,重点聚焦最短路算法和典型题目解析。这个专题包含三个核心部分:LeetCode第97题"小明逛公园"的解法思路、第127题"骑士的攻击"的图论建模,以及最短路算法的系统总结和比较。作为算法竞赛和面试中的高频考点,图论问题往往让初学者感到棘手,特别是如何将实际问题抽象为图论模型,以及不同场景下的算法选型。
我在刷题过程中发现,很多图论题目看似复杂,但核心都是对基础算法的灵活运用。比如"小明逛公园"本质上是最短路径问题的变种,而"骑士的攻击"则需要巧妙构建图模型。本文将用实际代码演示如何拆解这些问题,并附上我整理的算法对比表格和复杂度分析。对于正在准备算法面试或竞赛的同学,这些内容能帮你快速建立图论问题的解决框架。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 最短路算法全家桶
最短路算法是图论中的基石,根据图的特点和问题需求,我们通常会在以下四种算法中选择:
-
Dijkstra算法:
- 适用条件:无负权边的加权图
- 时间复杂度:普通队列O(V²),二叉堆优化O(E log V)
- 核心思想:贪心策略,每次扩展当前最短路径
python复制def dijkstra(graph, start): dist = {node: float('inf') for node in graph} dist[start] = 0 heap = [(0, start)] while heap: current_dist, u = heapq.heappop(heap) if current_dist > dist[u]: continue for v, weight in graph[u].items(): if dist[v] > dist[u] + weight: dist[v] = dist[u] + weight heapq.heappush(heap, (dist[v], v)) return dist -
Bellman-Ford算法:
- 适用条件:允许负权边,能检测负权环
- 时间复杂度:O(VE)
- 优势:可以处理带负权的情况
-
SPFA算法:
- 适用条件:Bellman-Ford的队列优化版本
- 平均时间复杂度:O(E),最坏O(VE)
- 实际表现:在稀疏图上效率接近Dijkstra
