给出一个无向图G,求其连通分量的数量。
输入格式:
第1行输入正整数N(0<N≤1000)和E(0<E≤5000),为顶点个数和边数。 N个结点的序号依次为1~N,接下来E行每行输入连接边的两个顶点编号。
输出格式:
输出以上图的连通分量的数目。
输入样例1:
7 5
5 6
1 2
1 4
2 3
3 4
输出样例1:
3
输入样例2:
8 7
1 2
1 6
2 3
2 7
3 5
4 5
5 8
输出样例2:
1
输入样例3:
8 0
输出样例3:
8
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 K
cpp
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
int graph[MAX + 1][MAX + 1]; // 邻接矩阵表示图
int visit[MAX + 1]; // 记录每个节点是否被访问过
void dfs(int node, int n)
{
visit[node] = 1;
for (int i = 1; i <= n; i++)
{
if (graph[node][i] && !visit[i])
{
dfs(i, n);
}
}
}
int main()
{
int n, e;
scanf("%d %d", &n, &e);
// 初始化图和访问数组
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
graph[i][j] = 0;
}
visit[i] = 0;
}
// 读取边信息并构建图
for (int i = 0; i < e; i++)
{
int u, v;
scanf("%d %d", &u, &v);
graph[u][v] = 1;
graph[v][u] = 1; // 无向图,对称赋值
}
int connected = 0;
// 遍历所有节点,寻找连通分量
for (int i = 1; i <= n; i++)
{
if (!visit[i])
{
dfs(i, n);
connected++;
}
}
printf("%d\n", connected);
return 0;
}