DFS
Coddy 图:数据结构系列 #9 课程的第 11 课,共 14 课。
深度优先搜索先深入,再拓宽。从一个顶点开始,沿着一条边尽可能向前搜索,然后回溯并尝试下一条边。迭代版本使用栈:弹出一个顶点,记录它,再把尚未访问的邻居压入栈中。
为了让 DFS 在这次挑战中按确定的顺序遍历,要按逆序排序的顺序压入邻居。这样,最小的邻居就会位于栈顶并最先被处理,得到的顺序与按升序邻居进行递归 DFS 时一致。
注意,某个顶点可能会被压入栈中两次(不同的邻居可能都连接到它)。在循环开头检查已访问集合,如果该顶点已经访问过,就跳过。
挑战
简单编写一个函数 dfs,它接收一个二维整数数组 adjacency(每一行都是一条 [u, v] 边)和一个整数 start,并以整数列表的形式返回从 start 开始的 DFS 访问顺序。
通过添加每条边来构建图。使用栈进行迭代式 DFS:弹出一个顶点,如果它尚未访问,就记录它,并按逆序排序后的顺序压入它的邻居,这样会优先处理最小的邻居。
你必须使用 Graph 类(在 graph 中提供),不要使用语言内置类型(映射、集合)来表示邻接关系。算法的辅助数据(已访问集合、栈)可以使用标准库类型。
亲手试试
#include <stdio.h>
#include "solution.h"
int main() {
int n, m, start;
if (scanf("%d %d %d", &n, &m, &start) != 3) return 0;
int adjacency[1024][2];
for (int i = 0; i < m; i++) scanf("%d %d", &adjacency[i][0], &adjacency[i][1]);
int out[MAX_VERTICES];
int outn = dfs(adjacency, m, start, out);
for (int i = 0; i < outn; i++) {
if (i > 0) printf(" ");
printf("%d", out[i]);
}
printf("\n");
return 0;
}
图:数据结构系列 #9中的所有课
自己练习: C 在线编译器