Archipelago

Lec 14有向图与 DAG

讲义完成更新于 2026-09-16

Lec 14 有向图与 DAG

资料依据:课程视频与 transcript · Lecture notes

TL;DR

  • 有向图区分入边与出边,“可达”不再对称;强连通分量将互相可达的顶点缩约后,得到的凝聚图一定是 DAG。
  • DAG 不含有向环,因而必有入度为 0 的源点和出度为 0 的汇点,并且至少存在一个拓扑序。
  • 拓扑序把所有有向边的起点放在终点之前;它可用于表示依赖、调度任务和将偏序线性扩展。

1. 有向图基础

定义: 有向图(Digraph) G=(V,E)G = (V, E) 中,E⊆V×VE \subseteq V \times V 是有序对的集合。边 (u,v)(u, v) 写作 u→vu \to v,表示从 uu 到 vv 的有向边。

与无向图的区别:

  • 允许自环 (v,v)(v, v)。
  • 允许反向平行边:(u,v)(u, v) 与 (v,u)(v, u) 是不同的两条边。
  • 仍然不允许重边(不能有两条 u→vu \to v)。

应用举例: 状态机(状态 = 顶点,转移 = 有向边)、Twitter 关注图、道路网络(双向路用两条有向边表示)、网页超链接图(PageRank 的基础)。

度数

  • 入度 deg⁡−(v)\deg^-(v):指向 vv 的边数。
  • 出度 deg⁡+(v)\deg^+(v):从 vv 出发的边数。

有向握手引理:

∑v∈Vdeg⁡−(v)=∣E∣=∑v∈Vdeg⁡+(v)\sum_{v \in V} \deg^-(v) = |E| = \sum_{v \in V} \deg^+(v)

游走与路径

有向游走:顶点序列 v0,…,vkv_0, \ldots, v_k,满足 (vi,vi+1)∈E(v_i, v_{i+1}) \in E(必须沿边的方向行走)。迹、路径、闭游走、回路的定义与无向图完全类似。

定理: 若存在从 uu 到 vv 的有向游走,则存在从 uu 到 vv 的有向路径。

在有向图中,圈可以有长度 1(自环)或长度 2(反向平行边对),而无向图中圈的长度至少为 3。


2. 有向连通性

有向图中,连通性不对称。

定义: 若存在从 uu 到 vv 的有向游走,则称 uu 能到达 vv(vv 从 uu 可达)。

定义: 若 uu 能到达 vv 且 vv 能到达 uu,则称 uu 与 vv 强连通。

定义: 若每对顶点都强连通,则称图 GG 为强连通图。

有向欧拉回路

定理: 有向图存在欧拉回路,当且仅当图是强连通的,且每个顶点的入度等于出度。


3. 强连通分量(SCC)

定义: 顶点 vv 的强连通分量(SCC) [v][v] 是所有与 vv 强连通的顶点导出的子图。

SCC 对顶点构成划分。但与无向连通分量不同,SCC 之间可以存在有向边。

凝聚图(Condensation Graph)

定义: 图 G=(V,E)G = (V, E) 的凝聚图 H=(C,E′)H = (C, E'),其中:

  • C={[v]:v∈V}C = \{[v] : v \in V\}(每个 SCC 压缩为一个节点)
  • E′={([u],[v]):[u]≠[v], (u,v)∈E}E' = \{([u], [v]) : [u] \neq [v],\ (u, v) \in E\}(SCC 之间若有有向边则建立对应边,删去自环)

关键性质: 每个凝聚图都是 DAG。


4. DAG(有向无环图)

定义: 有向无环图(DAG) 是没有有向圈的有向图。

类比关系:无环无向图 → 森林;无环有向图 → DAG。

应用: 任务依赖调度、并发控制、数据处理流水线、构建系统等。

Hasse 图

  • 若 u→vu \to v 是两点之间唯一的有向路径,则称为覆盖边。
  • 否则称为冗余边(存在绕过该边的其他路径)。
  • 只保留覆盖边得到的 DAG 称为 Hasse 图,它用更少的边编码了相同的偏序关系。

5. 拓扑排序

定义: 入度为 0 的顶点称为源点(Source);出度为 0 的顶点称为汇点(Sink)。在 DAG 中,源点即极小元,汇点即极大元。

定义: DAG 的拓扑序(拓扑排序) 是所有顶点的一个线性排列,使得每个顶点都出现在所有从它可达的顶点之前。

定理: 每个有限 DAG 都有拓扑序。

引理: 每个有限 DAG 至少有一个源点。

证明: 取最长有向路径,其起点必须是源点;否则可延长路径,或存在圈——均矛盾。

对 nn 作归纳的证明:

  • 基础情形 n=0n=0:空序列即为拓扑序。✓
  • 归纳步骤: 设 GG 是 nn 个顶点的 DAG,取其源点 vv。令 H=G∖{v}H = G \setminus \{v\},HH 是 n−1n-1 个顶点的 DAG,由归纳假设有拓扑序。在该序列最前面加上 vv,即得 GG 的拓扑序。✓

6. 并行任务调度

目标: 给定带依赖关系的任务 DAG,使用尽可能多的并行工作者,最小化完成所有任务所需的阶段数。

定义:

  • 两个顶点 u,vu, v 可比,若其中一个能到达另一个。
  • 链(Chain) 是一个两两可比的顶点集合——链中的任务必须串行执行。
  • 反链(Antichain) 是一个两两不可比的顶点集合——反链中的任务可以同时执行。
  • 关键路径(Critical Path) 是最大的链。

基本事实:

最短并行调度的阶段数 ≥\geq 最长链的长度。

最短并行调度的阶段数 == 最长链的长度。

证明思路: 定义 depth(v)\text{depth}(v) = 以 vv 为终点的最长路径长度。令 Vi={v:depth(v)=i}V_i = \{v : \text{depth}(v) = i\}。

  • 若 uu 能到达 v≠uv \neq u,则 depth(u)<depth(v)\text{depth}(u) < \text{depth}(v)(可将到达 uu 的路径接上 u→vu \to v 的路径)。
  • 故每个 ViV_i 是反链(其中所有顶点互不可达)。
  • 每个 vv 的所有前驱深度严格更小,故在第 ii 阶段执行所有 ViV_i 中的任务,所有依赖已满足。
  • 总共恰好需要 cc 个阶段(cc 为关键路径长度)。

穿衣例子(Getting Dressed):

V1 = {左袜, 右袜, 裤子, 衬衫}
V2 = {左鞋, 右鞋, 腰带, 外套}
V3 = {围巾, 帽子}
V4 = {大衣}

关键路径为 {衬衫 → 外套 → 围巾 → 大衣},共 4 个阶段。

注:最大反链的大小给出所需工作者数量的上界,但实际可能需要更少。


7. Dilworth 定理(了解,不考)

定理: 对任意 t>0t > 0,nn 个顶点的 DAG 必然存在大小 >t> t 的链,或大小 ≥n/t\geq n/t 的反链。

推论(取 t=nt = \sqrt{n}):每个 nn 顶点 DAG 必然存在大小 ≥n\geq \sqrt{n} 的链或反链。

证明: 若最大链大小 c≤tc \leq t 且最大反链大小 ℓ<n/t\ell < n/t,则按深度划分顶点得到 cc 个反链,每个大小 <ℓ< \ell,总顶点数 <c⋅ℓ<t⋅(n/t)=n< c \cdot \ell < t \cdot (n/t) = n——与共有 nn 个顶点矛盾。

我的理解

我的理解

强连通分量是处理一般有向图的关键压缩:分量内的顶点在可达性上无法区分,分量之间则恢复为 DAG,从而可以再使用拓扑顺序和动态规划。