如何用C语言实现邻接表表示的无向图中计算连通分量的数量,并分别输出每个连通分量对应的顶点集合?
时间: 2024-11-09 12:26:43 浏览: 33
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
在C语言中,我们可以使用邻接表(Adjacency List)来表示无向图,因为邻接表非常适合存储稀疏图。要计算连通分量的数量并输出每个连通分量的顶点集合,可以按照以下步骤操作:
1. **初始化**:创建一个哈希表(如链表或数组),其中键是顶点,值是一个包含该顶点的连通分量的列表。
2. **遍历**:从任意一个未访问过的顶点开始深度优先搜索(DFS)。对于每个访问的顶点,将其添加到当前连通分量中。同时,标记该顶点为已访问。
3. **递归**:对于所有与当前顶点相连的未访问顶点,继续进行DFS直到图中所有连通部分都被访问过。
4. **计数和输出**:在遍历结束后,哈希表中的每个列表都将代表一个连通分量。计数哈希表的大小就是连通分量的数量。为了输出每个连通分量,只需遍历哈希表,打印出每个列表中的顶点即可。
下面是一个简单的伪代码示例:
```c
#include <stdbool.h>
#include <stdio.h>
// 邻接表结构体,假设每个节点有一个指向下一个节点的指针
typedef struct Node {
int vertex;
struct Node* next;
} Node;
typedef struct Graph {
int V; // 顶点数
Node** adj; // 邻接表数组
} Graph;
void dfs(Graph* g, int v, bool visited[], vector<int>* components) {
visited[v] = true;
components->push_back(v);
Node* temp = g->adj[v];
while (temp != NULL) {
if (!visited[temp->vertex]) {
dfs(g, temp->vertex, visited, components);
}
temp = temp->next;
}
}
int countConnectedComponents(Graph* g) {
int V = g->V;
bool* visited = new bool[V];
memset(visited, false, sizeof(bool) * V);
int count = 0;
vector<vector<int>> components;
for (int i = 0; i < V; ++i) {
if (!visited[i]) {
vector<int> component;
dfs(g, i, visited, &component);
components.push_back(component);
count++;
}
}
delete[] visited;
return count;
}
void printComponents(vector<vector<int>>& components) {
for (int i = 0; i < components.size(); ++i) {
printf("连通分量 %d: {", i);
for (int j = 0; j < components[i].size(); ++j) {
printf("%d ", components[i][j]);
}
printf("}\n");
}
}
int main() {
// 初始化你的邻接表...
Graph* g = ...;
int num_components = countConnectedComponents(g);
printComponents(components);
return 0;
}
```
阅读全文