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

图算法的本质是:

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

相关推荐
50万马克的面包18 分钟前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表
All for pursuit.22 分钟前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青23 分钟前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq24 分钟前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq26 分钟前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
50万马克的面包30 分钟前
数据结构01-数据结构概念与复杂度-博客稿
数据结构
Logic1011 小时前
C语言/数据结构贪心算法题解:字符串趋同——逐位统计最高频率求最小修改代价
c语言·数据结构·贪心算法·字符串·时间复杂度·频率统计·算法题
the3clipse1 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE1 小时前
10.4【A】
算法
Godspeed Zhao2 小时前
现代智能雷达技术19——算法(5)
算法