C语言,公司想知道是否所有的结点已经连通,如果不连通有哪些连通分量,请问如何解决?代码实现
时间: 2024-03-25 13:39:38 浏览: 42
这个问题可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来解决。以下是使用DFS实现的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_NODE_NUM 1000
bool visited[MAX_NODE_NUM]; // 用于记录结点是否已访问
int adjMatrix[MAX_NODE_NUM][MAX_NODE_NUM]; // 邻接矩阵,用于表示图的连接关系
int nodeNum, edgeNum; // 结点数和边数
void dfs(int node) {
visited[node] = true;
printf("%d ", node);
for (int i = 0; i < nodeNum; i++) {
if (adjMatrix[node][i] && !visited[i]) {
dfs(i);
}
}
}
void findConnectedComponents() {
int count = 0;
printf("Connected Components: \n");
for (int i = 0; i < nodeNum; i++) {
if (!visited[i]) {
count++;
printf("Component %d: ", count);
dfs(i);
printf("\n");
}
}
}
int main() {
scanf("%d %d", &nodeNum, &edgeNum);
for (int i = 0; i < edgeNum; i++) {
int node1, node2;
scanf("%d %d", &node1, &node2);
adjMatrix[node1][node2] = 1;
adjMatrix[node2][node1] = 1; // 无向图需要加上这一行
}
findConnectedComponents();
return 0;
}
```
在这个代码中,我们首先输入结点数和边数,然后读取每一条边,通过邻接矩阵表示图的连接关系。然后我们从第一个结点开始进行DFS遍历,记录哪些结点已经被访问过,如果一个结点没有被访问过,说明它还没有和其他结点连通,我们就从它开始进行DFS遍历,并输出这个连通分量中的所有结点。最终,我们就可以得到所有的连通分量。
需要注意的是,这个算法的时间复杂度为O(N^2),其中N为结点数。如果图比较大,建议使用BFS来实现,时间复杂度为O(N+E),其中E为边数。
阅读全文