用C++算法实现:一个无向图,设计合理的数据结构对图进行存储,设计算法,输出一个无向图的每个连通分量的顶点集合。
时间: 2024-12-29 22:30:50 浏览: 23
要实现一个无向图并找出其连通分量,我们可以使用邻接表(Adjacency List)作为数据结构来存储图。在C++中,这通常涉及到两个主要部分:定义图的数据结构和实现连通分量检测算法。
**1. 定义图的数据结构**
首先,创建一个`Node`类表示图中的节点,以及一个`Graph`类用于存储节点和连接关系:
```cpp
// Node 类代表图中的一个顶点
class Node {
public:
int vertex;
vector<Node*> neighbors; // 存储邻居节点
};
// Graph 类表示无向图
class Graph {
private:
vector<Node*> nodes;
public:
void addEdge(int u, int v); // 添加边的方法
};
```
**2. 实现添加边的方法**
在这个`addEdge`方法中,我们可以在`nodes`向量中找到对应顶点的`Node`实例,并在其`neighbors`向量中添加另一个顶点的`Node`实例:
```cpp
void Graph::addEdge(int u, int v) {
auto& nodeU = findNode(u);
auto& nodeV = findNode(v);
nodeU.neighbors.push_back(nodeV);
nodeV.neighbors.push_back(nodeU); // 图是无向的,所以双向连接
}
// 查找节点的方法
Node* Graph::findNode(int vertex) {
for (auto& node : nodes) {
if (node->vertex == vertex)
return node;
}
// 如果找不到,就新建一个节点
Node* newNode = new Node{vertex};
nodes.push_back(newNode);
return newNode;
}
```
**3. 连通分量检测算法**
为了找出连通分量,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)。这里以DFS为例:
```cpp
vector<vector<int>> connectedComponentsDFS(Graph& graph) {
vector<bool> visited(graph.nodes.size(), false);
vector<vector<int>> components;
for (int i = 0; i < graph.nodes.size(); ++i) {
if (!visited[i]) {
vector<int> component;
dfs(graph, i, visited, component);
components.push_back(component);
}
}
return components;
}
void dfs(Graph& graph, int vertex, vector<bool>& visited, vector<int>& component) {
visited[vertex] = true;
component.push_back(vertex);
for (const auto& neighbor : graph.nodes[vertex].neighbors) {
if (!visited[neighbor->vertex])
dfs(graph, neighbor->vertex, visited, component);
}
}
```
现在,你可以通过调用`connectedComponentsDFS`函数来获得图的所有连通分量的顶点集合:
```cpp
Graph g;
// 建立无向图...
vector<vector<int>> components = connectedComponentsDFS(g);
for (const auto& component : components) {
cout << "Connected component: ";
for (int vertex : component) {
cout << vertex << " ";
}
cout << endl;
}
```
阅读全文