试用C++设计一个算法Mark标记一个无向图G的各个连通分量,即第i个连通分量标记为i。并写出代码
时间: 2024-05-19 21:17:42 浏览: 97
首先需要一个变量 count,表示连通分量的个数,初始化为 0。
然后遍历图的所有节点,对于每个节点进行深度优先遍历(DFS),同时将遍历到的节点标记为 count+1,每当 DFS 完成一个连通分量的遍历时,count 加 1。因为节点只会被遍历一次,所以这个算法的时间复杂度为 O(n+m),其中 n 是节点个数,m 是边数。
以下是代码实现:
void DFS(int u, vector<int>& mark, vector<vector<int>>& graph, int count) {
mark[u] = count;
for (int v : graph[u]) {
if (mark[v] == 0) {
DFS(v, mark, graph, count);
}
}
}
void markComponents(vector<vector<int>>& graph, vector<int>& mark) {
int n = graph.size();
int count = 0;
for (int i = 0; i < n; i++) {
if (mark[i] == 0) {
count++;
DFS(i, mark, graph, count);
}
}
}
调用 markComponents(graph, mark) 即可标记图的连通分量。其中 graph 是邻接表表示的无向图,mark 是一个长度为 n 的数组,用来存储每个节点所属的连通分量编号,初始值为 0。
阅读全文