设计算法,将一个无向图的邻接矩阵转换为邻接表C++实现
时间: 2024-12-15 22:19:38 浏览: 6
在C++中,将无向图的邻接矩阵表示转换为邻接表是一个常见的图形算法操作。邻接表通常用于提高图的遍历效率。以下是一个简单的示例,假设我们有一个二维数组表示邻接矩阵:
```cpp
#include <vector>
#include <list>
class Graph {
private:
int V; // 图的顶点数
vector<vector<int>> adjMatrix; // 邻接矩阵
public:
Graph(int vertices) : V(vertices), adjMatrix(V, vector<int>(V)) {}
void addEdge(int src, int dest) {
adjMatrix[src][dest] = 1; // 对称矩阵,从src到dest和从dest到src都存储边
adjMatrix[dest][src] = 1;
}
void convertToAdjList() {
vector<list<int>> adjList(V); // 创建邻接表
// 将邻接矩阵转为邻接表
for (int i = 0; i < V; ++i) {
for (int j = 0; j < V; ++j) {
if (adjMatrix[i][j] == 1) {
adjList[i].push_back(j); // 添加从i到j的边
}
}
}
}
// 获取给定节点的邻接节点列表
list<int>& getNeighbors(int node) {
return adjList[node];
}
};
// 示例用法
int main() {
Graph g(5);
g.addEdge(0, 1);
g.addEdge(0, 4);
g.addEdge(1, 2);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 3);
g.convertToAdjList();
// 打印邻接表形式的邻接节点
for (int i = 0; i < g.V; ++i) {
cout << "Node " << i << ": ";
for (auto it : g.getNeighbors(i)) {
cout << it << " ";
}
cout << endl;
}
return 0;
}
```
在这个例子中,`Graph` 类包含了邻接矩阵以及将其转换为邻接表的方法。`convertToAdjList` 方法遍历整个矩阵,当找到一条边时就将其添加到对应的邻接列表中。`getNeighbors` 方法用于获取特定节点的邻居列表。
阅读全文