用C实现 输入格式: • 第一行为节点个数(n<= 2000000)和边数(m<= 2030000) ,然后下面每一行为边 的头尾节点 • 输出格式: • 连通分量个数 • 样例输入: 3 1 1 2 样例输出: 2
时间: 2024-02-28 13:52:48 浏览: 51
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 2000000
#define MAX_M 2030000
bool visited[MAX_N+1];
int graph[MAX_N+1][MAX_M+1];
int count = 0;
void dfs(int node, int n) {
visited[node] = true;
for (int i = 1; i <= graph[node][0]; i++) {
int neighbor = graph[node][i];
if (!visited[neighbor]) {
dfs(neighbor, n);
}
}
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
// 读入边信息
for (int i = 1; i <= m; i++) {
int a, b;
scanf("%d %d", &a, &b);
graph[a][++graph[a][0]] = b;
graph[b][++graph[b][0]] = a;
}
// 遍历所有节点
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
dfs(i, n);
count++;
}
}
printf("%d\n", count);
return 0;
}
```
时间复杂度为O(n+m),空间复杂度为O(n+m)。
阅读全文