Menu
CoddyTech

统计连通分量

Coddy 图:数据结构系列 #9 课程的第 13 课,共 14 课。

连通分量是一个极大的顶点集合,其中任意一对顶点之间都有路径。没有边的图,其连通分量数量等于顶点数量;完全连通的图恰好有一个连通分量。

要统计连通分量,遍历所有顶点。每当你找到一个尚未访问的顶点,它就是一个新的连通分量:计数器加一,然后从该顶点开始进行 BFS 或 DFS,将所有可达顶点标记为已访问。接着继续处理下一个尚未访问的顶点。

这个挑战会同时提供顶点列表和边,因为孤立顶点(没有边)仍然各自算作一个连通分量,而且我们必须知道它们存在。

challenge icon

挑战

简单

编写函数 countConnectedComponents,接收二维 int 数组 adjacency 和 int 数组 vertices,并返回图中的连通分量数。

构建图:先对 vertices 中的每个键调用 addVertex(这样孤立顶点也会存在),再对 adjacency 中的每一对调用 addEdge。然后遍历所有顶点:每个未访问的顶点都会开始一个新的连通分量(计数器加一),接着从该顶点开始进行 DFS/BFS,将整个连通分量标记为已访问。

你必须使用 Graph 类(在 graph 中提供),不要使用语言内置类型(映射、集合)来表示邻接关系。算法的辅助数据(已访问集合、栈)可以使用标准库类型。

亲手试试

#include <stdio.h>
#include "solution.h"

int main() {
    int n, m;
    if (scanf("%d %d", &n, &m) != 2) return 0;
    int vertices[MAX_VERTICES];
    for (int i = 0; i < n; i++) scanf("%d", &vertices[i]);
    int adjacency[1024][2];
    for (int i = 0; i < m; i++) scanf("%d %d", &adjacency[i][0], &adjacency[i][1]);
    printf("%d\n", countConnectedComponents(adjacency, m, vertices, n));
    return 0;
}

图:数据结构系列 #9中的所有课

自己练习: C 在线编译器