每天学一个算法--图算法(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. 最小教学总结

图算法的本质是:

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

相关推荐
埃伊蟹黄面2 小时前
C++ —— 智能指针
开发语言·c++·算法
董董灿是个攻城狮2 小时前
马斯克在用炸火箭的方式训练 AGI。。。
算法
Pentane.2 小时前
【力扣hot100】【Leetcode 54】螺旋矩阵|边界控制 算法笔记及打卡(19/100)
算法·leetcode·矩阵
黎阳之光2 小时前
黎阳之光:港口智能体集群,重塑智慧港口新范式
大数据·人工智能·算法·安全·数字孪生
大写的z先生2 小时前
【深度学习 | 论文精读】
深度学习·算法·语言模型
大肥羊学校懒羊羊2 小时前
质因数个数问题:高效分解算法详解
开发语言·c++·算法
米粒12 小时前
力扣算法刷题Day 49(接雨水)
算法·leetcode·职场和发展
探物 AI2 小时前
【感知实战·数据增强篇】深度解析目标检测中的图片数据增强算法,多图演示效果
人工智能·算法·目标检测
Evand J2 小时前
【MATLAB代码介绍】三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波,目标高精度、自适应跟踪定位
开发语言·算法·matlab·imm·代码介绍