给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写程序来计算无向图中连通分量的数目。要求以邻接矩阵方式存储图。 【输入形式】 顶点数目 边数目 边列表 【输出形式】 连通分量的数目 【样例输入】 5 3 0 1 1 2 3 4 【样例输出】 2。用c语言实验的完整代码
时间: 2024-02-13 19:05:31 浏览: 220
以下是使用邻接矩阵存储图,利用深度优先搜索算法求解连通分量数目的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef enum {
FALSE,
TRUE
} Boolean; // 布尔类型定义
Boolean visited[MAX_VERTEX_NUM]; // 标记数组
int graph[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertexNum, edgeNum; // 顶点数和边数
// 深度优先搜索
void DFS(int vertex) {
visited[vertex] = TRUE; // 标记为已访问
for (int i = 0; i < vertexNum; i++) {
if (graph[vertex][i] == 1 && !visited[i]) {
DFS(i); // 递归搜索
}
}
}
// 计算连通分量数目
int countConnectedComponents() {
int count = 0; // 连通分量数目
for (int i = 0; i < vertexNum; i++) {
if (!visited[i]) {
DFS(i); // DFS搜索
count++; // 连通分量数目加1
}
}
return count;
}
int main() {
scanf("%d %d", &vertexNum, &edgeNum);
// 初始化邻接矩阵
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
graph[i][j] = 0;
}
}
// 读入边列表,构建邻接矩阵
for (int i = 0; i < edgeNum; i++) {
int x, y;
scanf("%d %d", &x, &y);
graph[x][y] = graph[y][x] = 1; // 无向图,需要将两个方向都设置为1
}
// 初始化标记数组
for (int i = 0; i < vertexNum; i++) {
visited[i] = FALSE;
}
// 计算连通分量数目
int count = countConnectedComponents();
// 输出结果
printf("%d\n", count);
return 0;
}
```
注:以上代码只是一种实现方式,不一定是最优的。
阅读全文