| 项目 | 值 |
|---|---|
| 主题 | 图的遍历 |
| 核心概念 | 从起始顶点出发,访问一个邻接点,再访问其邻接点,直到无法继续,回溯继续 |
| 时间复杂度 | $O(|V|)$、$O(|V|+|E|)$、邻接矩阵 $O(|V|^2)$ |
| 难度 | ⭐⭐⭐ |
| 重要性 | ⭐⭐⭐⭐⭐ |
从起始顶点出发,访问一个邻接点,再访问该邻接点的邻接点,直到无法继续,回溯到上一个顶点继续。
bool visited[MaxVertexNum];
void DFS(MGraph G, int v) {
visit(v);
visited[v] = true;
for (int w = 0; w < G.vexnum; w++)
if (G.edge[v][w] == 1 && !visited[w])
DFS(G, w);
}
void DFS(ALGraph G, int v) {
visit(v);
visited[v] = true;
ArcNode *p = G.vertices[v].first;
while (p != NULL) {
if (!visited[p->adjvex])
DFS(G, p->adjvex);
p = p->next;
}
}
void DFSTraverse(MGraph G) {
for (int i = 0; i < G.vexnum; i++)
visited[i] = false;
for (int i = 0; i < G.vexnum; i++)
if (!visited[i])
DFS(G, i);
}
| 存储方式 | 时间复杂度 |
|---|---|
| 邻接矩阵 | $O(|V|^2)$ |
| 邻接表 | $O(|V|+|E|)$ |
从起始顶点出发,先访问所有邻接点,再依次访问邻接点的邻接点。
void BFS(ALGraph G, int v) {
Queue Q; InitQueue(&Q);
visit(v); visited[v] = true; EnQueue(&Q, v);
while (!QueueEmpty(Q)) {
DeQueue(&Q, &v);
ArcNode *p = G.vertices[v].first;
while (p != NULL) {
if (!visited[p->adjvex]) {
visit(p->adjvex);
visited[p->adjvex] = true;
EnQueue(&Q, p->adjvex);
}
p = p->next;
}
}
}
| 存储方式 | 时间复杂度 |
|---|---|
| 邻接矩阵 | $O(|V|^2)$ |
| 邻接表 | $O(|V|+|E|)$ |
| 特性 | DFS | BFS |
|---|---|---|
| 数据结构 | 栈(递归) | 队列 |
| 搜索策略 | 深度优先 | 广度优先 |
| 空间复杂度 | $O(|V|)$ | $O(|V|)$ |
| 典型应用 | 拓扑排序、连通性 | 无权图最短路径 |
邻接表:
0 → [1] → [2]
1 → [0] → [3]
2 → [0] → [3]
3 → [1] → [2] → [4]
4 → [3]
访问序列:0 → 1 → 3 → 2 → 4
访问序列:0 → 1 → 2 → 3 → 4
0 --- 1 3 --- 4
2 5
DFS 调用 3 次,分别访问 {0,1,2}、{3,4}、{5} ⟹ 连通分量数 = 3
| 遍历方式 | 数据结构 | 时间(邻接表) | 时间(邻接矩阵) |
|---|---|---|---|
| DFS | 栈 | $O(|V|+|E|)$ | $O(|V|^2)$ |
| BFS | 队列 | $O(|V|+|E|)$ | $O(|V|^2)$ |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。