← 返回课程路线 第四阶段 · S4-07 · 60 分钟

用邻接表和访问标记,数出连通块

这一课只练一件事:遇到“若干个点、若干条边,问一共分成几组互相连通”这类问题时,用把点和边画出来,用记录每个点连着谁,再用防止重复访问,跑一次或数出数量。必会:能画出小图和邻接关系、能写访问标记、能说明 DFS 与 BFS 的顺序差异。最小示例:5 个点(编号 0~4),边为 (0,1) (1,2) (3,4),这是无向图,1 <= n <= 1000。样例追踪:邻接表 adj[0]={1}, adj[1]={0,2}, adj[2]={1}, adj[3]={4}, adj[4]={3};访问标记 visited 全部初始化为 false;从 0 出发 DFS 访问到 {0,1,2},再从还没访问过的 3 出发 DFS 访问到 {3,4},连通块数 = 2。边界是没有边的孤立点(自己就是一个连通块)和已经访问过的点(不能再重复计数)。建议掌握:DFS 沿一条路径尽量走到底再回头,BFS 按“一层一层”向外扩展,得到的是离起点的最短步数层级,这两种顺序本质不同。拓展:BFS 求出的层数可以直接当作“最短步数”的初步认识,现在只需要知道概念,不强制要求现在就写完整的最短路模板。这里不会在浏览器里运行 C++。

必会:能画邻接关系;能写访问标记;能说明 DFS 与 BFS 的顺序差异 建议掌握:DFS 走到底再回头,BFS 一层一层扩展,两者顺序本质不同 拓展:BFS 的层数就是最短步数的初步认识,现在先认识概念,不当硬门槛

任务 1:先选出该怎么表示图,怎么防止重复访问

先确定用什么方式记录里“谁和谁相连”,再确定怎么防止 DFS/BFS 重复访问同一个点。点不认识的词可看基础解释。

必会:能说出邻接表怎么保存每个点的邻居;能说出为什么需要。这里不会在浏览器里运行 C++,只练习选择和走过程。

5 个点(0~4),边为 (0,1) (1,2) (3,4),要频繁查询某点直接相连的点,最合适的表示方式是?图的表示 · 必会

DFS 从 0 出发会经过 0→1→2,如果不记录“谁已经访问过”,可能会发生什么?访问标记 · 必会