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

图算法的本质是:

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

相关推荐
8Qi86 分钟前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS25 分钟前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚1 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法
智者知已应修善业1 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机
小许同学记录成长1 小时前
几何体编辑与布尔运算
算法·无人机
fanged2 小时前
简单看看3A算法2(TODO)
算法
智者知已应修善业2 小时前
【51单片机4位静态数码管显示1234】2023-11-14
c++·经验分享·笔记·算法·51单片机
♡すぎ♡2 小时前
镜面 IBL 预过滤贴图的计算
算法·计算机图形学·贴图·pbr
Lsk_Smion2 小时前
力扣实训 _ [200].岛屿数量
算法·leetcode·深度优先
Boom_Shu2 小时前
长方形的关系
数据结构·c++·算法