每天学一个算法--图算法(Graph Algorithms)

📘 教案 06:图算法(Graph Algorithms)


1. 问题定义

图用于描述:

"对象之间的关系"


形式化定义

一个图 (G = (V, E)):

  • (V):顶点集合(nodes)
  • (E):边集合(edges)

示例

  • 社交网络(人之间的关系)
  • 地图(城市之间的路径)
  • 推荐系统(用户-物品关系)

2. 核心术语


2.1 有向图 vs 无向图


无向图

(u,v)=(v,u)\]\[ (u, v) = (v, u) \]\[(u,v)=(v,u)

👉 双向关系


有向图

u→v\]\[ u \\to v \]\[u→v

👉 单向关系


2.2 权重(Weight)

边可以带权:

(u,v,w)\]\[ (u, v, w) \]\[(u,v,w)

👉 表示距离 / 成本 / 时间


2.3 路径(Path)

节点序列:

A→B→C\]\[ A \\to B \\to C \]\[A→B→C


2.4 图的表示(必须讲)


邻接矩阵(Adjacency Matrix)

n×n\]\[ n \\times n \]\[n×n

优点:

  • 查询快

缺点:

  • 空间大

邻接表(Adjacency List)

text 复制代码
A: B, C
B: D

优点:

  • 节省空间
  • 实用性强

3. 图的遍历(基础)


3.1 深度优先搜索(DFS)


思想:

一条路走到底,再回溯


代码结构

text 复制代码
DFS(node):
    标记 node

    for 邻居:
        if 未访问:
            DFS(邻居)

3.2 广度优先搜索(BFS)


思想:

一层一层扩展


数据结构:

👉 队列(Queue)


代码

text 复制代码
BFS(start):
    queue.push(start)

    while queue 非空:
        node = pop()
        访问 node

        for 邻居:
            入队

3.3 DFS vs BFS


项目 DFS BFS
数据结构 队列
特点 广
用途 搜索路径 最短路径(无权)

4. 最短路径问题(核心)


问题:

从一个点到其他点的最短路径


5. Dijkstra 算法(重点)


5.1 适用条件

👉 边权非负


5.2 核心思想(贪心)

每次选择当前"距离最小"的节点


5.3 状态定义

dist\[i\]=起点到 i 的最短距离\]\[ dist\[i\] = \\text{起点到 i 的最短距离} \]\[dist\[i\]=起点到 i 的最短距离


5.4 算法流程

text 复制代码
初始化 dist

while 存在未访问节点:
    选 dist 最小节点 u
    标记 u

    for 邻居 v:
        更新 dist[v]

5.5 转移公式

dist\[v\]=min⁡(dist\[v\],dist\[u\]+w(u,v))\]\[ dist\[v\] = \\min(dist\[v\], dist\[u\] + w(u,v)) \]\[dist\[v\]=min(dist\[v\],dist\[u\]+w(u,v))


5.6 时间复杂度

  • 普通:(O(n^2))
  • 堆优化:(O((V+E)\log V))

6. 最小生成树(MST)


问题:

连接所有节点,边权和最小


6.1 Kruskal 算法(贪心)


思想:

按边权从小到大选边,不形成环


数据结构:

👉 并查集(Union-Find)



6.2 Prim 算法


思想:

从一个点开始,不断扩展最小边


7. 图算法的本质总结


7.1 DFS / BFS

👉 搜索结构


7.2 Dijkstra

👉 最短路径(贪心)


7.3 MST

👉 最优连接(贪心)


8. 常见错误


❌ 错误1:图表示选错

👉 实际一般用邻接表


❌ 错误2:BFS不会用队列


❌ 错误3:Dijkstra用于负权图

👉 错误!


9. 关键结论


  1. 图 = 关系建模
  2. BFS/DFS = 基础遍历
  3. Dijkstra = 最短路径
  4. MST = 最小连接

10. 最小教学总结

图算法的本质是:

在"关系网络"中寻找结构或最优路径

相关推荐
To_OC6 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与10 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络15 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络2 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4002 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4002 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法