无向图
一、无向图的基本概念
- 定义:
- 无向图由一组顶点(vertex)和一组连接两个顶点的边(edge)组成。
- 边没有方向,记为 v-w 或 w-v,表示顶点 v 和 w 之间的无向连接。
- 表示方法:
- 顶点通常用 0 到 V-1 的整数表示(V 为顶点总数),便于数组索引操作。
- 可用符号表将顶点名映射到整数索引。
- 特殊情况:
- 自环:连接顶点自身的边。
- 平行边:连接同一对顶点的多条边。
- 简单图:无自环和平行边的图。
- 多重图:允许平行边的图。
二、术语表
- 相邻顶点:通过一条边连接的两个顶点。
- 度数:依附于某顶点的边总数。
- 子图:由图的部分边及其依附顶点构成的图。
- 路径:
- 一系列顶点通过边顺序连接。
- 简单路径:无重复顶点的路径。
- 长度:路径包含的边数。
- 环:
- 起点和终点相同的路径,至少含一条边。
- 简单环:除起点和终点外,无重复顶点和边的环。
- 连通性:
- 若两顶点间存在路径,则称两顶点连通。
- 连通图:任意顶点间都有路径。
- 连通分量:图中极大连通子图。
- 无环图:不含环的图。
- 树:
- 无环连通图。
- 生成树:包含图中所有顶点的树形子图。
- 森林:互不相连的树的集合。
- 图的密度:
- 已连接顶点对占所有可能的顶点对比例。
- 稀疏图:边数较少(E ≈ 小常数 × V)。
- 稠密图:边数接近最大可能值。
- 二分图:
- 可将顶点分为两部分,每条边连接的顶点分属不同部分的图。
三、树的性质
- 一幅含 V 个顶点的图是树,当且仅当满足以下任一条件:
- 有 V-1 条边且无环。
- 有 V-1 条边且连通。
- 连通,但删除任一条边会断开连通性。
- 无环,但添加任一条边会产生环。
- 任意顶点对间只有一条简单路径。
四、图的表示方法
- 邻接矩阵:
- V × V 布尔矩阵,[v][w] = true 表示 v-w 有边。
- 空间复杂度:V²,不适合稀疏图。
- 边的数组:
- 用类 Edge 存储每条边的两个顶点。
- 空间复杂度:E,但查询邻接顶点需遍历所有边,效率低。
- 邻接表(推荐):
- 以顶点为索引的数组,每个元素是一个链表,存储该顶点的邻接顶点。
- 空间复杂度:V + E。
- 添加边时间:常数。
- 遍历邻接顶点时间:与度数成正比。
五、图处理算法
- 深度优先搜索(DFS):
- 思想:从起点递归访问未标记的邻接顶点,标记已访问顶点。
- 时间复杂度:V + E(与顶点度数之和成正比)。
- 应用:
- 单点连通性:标记与起点连通的所有顶点。
- 单点路径:用 edgeTo[] 记录路径,找到从起点到某顶点的路径。
- 连通分量:识别图中所有连通子图。
- 检测环:若访问已标记顶点且非父节点,则有环。
- 双色问题:用两种颜色着色,判断是否为二分图。
- 广度优先搜索(BFS):
- 思想:用队列从起点逐层访问邻接顶点,确保找到最短路径。
- 时间复杂度:V + E。
- 应用:
- 命题:BFS 保证找到的路径是最短的。
六、符号图
- 定义:
- 用字符串而非整数表示顶点名。
- 输入格式:每行表示一组边,顶点名用分隔符隔开。
- 实现:
- 符号表 st:映射顶点名到索引。
- 反向索引 keys[]:映射索引到顶点名。
- 图对象 G:用索引表示图。
- 构造需遍历输入文件两遍:第一遍建索引,第二遍建图。
- 应用:
- 间隔度数:如 Kevin Bacon 游戏,用 BFS 找最短路径。
七、算法性能总结
问题 |
实现方法 |
时间复杂度 |
单点连通性 |
DepthFirstSearch |
V + E |
单点路径 |
DepthFirstPaths |
V + E |
单点最短路径 |
BreadthFirstPaths |
V + E |
连通分量 |
CC |
V + E |
检测环 |
Cycle |
V + E |
二分图检测 |
TwoColor |
V + E |