c++类模板将无向图的邻接矩阵转为对应邻接表,不用#include<vertor>,而且用template<class T>
时间: 2023-12-17 12:03:22 浏览: 25
以下是一个使用 `template<class T>` 的 C++ 类模板,将无向图邻接矩阵转换为对应邻接表的完整代码:
```
#include <iostream>
using namespace std;
template<class T, int N>
class Graph {
private:
T adjMatrix[N][N];
public:
Graph() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
adjMatrix[i][j] = T();
}
}
}
void addEdge(int i, int j, T weight) {
adjMatrix[i][j] = weight;
adjMatrix[j][i] = weight;
}
void getAdjList(T adjList[N][N]) {
for (int i = 0; i < N; i++) {
int k = 0;
for (int j = 0; j < N; j++) {
if (adjMatrix[i][j] != T()) {
adjList[i][k++] = j;
}
}
adjList[i][k] = -1;
}
}
};
int main() {
const int N = 5;
Graph<int, N> g;
g.addEdge(0, 1, 2);
g.addEdge(0, 4, 1);
g.addEdge(1, 2, 3);
g.addEdge(1, 3, 5);
g.addEdge(1, 4, 4);
g.addEdge(2, 3, 1);
g.addEdge(3, 4, 6);
int adjList[N][N];
g.getAdjList(adjList);
for (int i = 0; i < N; i++) {
cout << i << ": ";
for (int j = 0; adjList[i][j] != -1; j++) {
cout << adjList[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
在上面的代码中,我们定义了一个 Graph 类,该类使用邻接矩阵来表示无向图。该类使用 `template<class T, int N>` 来同时支持不同类型和不同大小的邻接矩阵。该类包含一个构造函数来初始化邻接矩阵和一个 addEdge() 函数来添加边。我们还定义了一个 getAdjList() 函数,该函数将邻接矩阵转换为对应的邻接表,并将邻接表存储在一个二维数组中。
在主函数中,我们创建了一个 Graph 对象并添加了一些带权边。然后,我们使用 getAdjList() 函数获取邻接表,并将其打印到控制台上。注意,我们在二维数组中使用 -1 表示邻接表的末尾。