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

图算法的本质是:

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

相关推荐
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
科技大视界1 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴1 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe1 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM2 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
可编程芯片开发2 小时前
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
算法
酿情师2 小时前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法
hansang_IR2 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
退休倒计时3 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
不是az3 小时前
力控相关知识点
算法·机器学习·最小二乘法