用C++编写一个图的实验程序,设计邻接表类AdjGraph和邻接矩阵类MatGraph,由带权有向图的边数组a创建邻接表G,由G 转换为邻接矩阵g,再由g 转换为邻接表G1,输出G、g和G1.用相关数据进行测试。
时间: 2024-02-09 21:10:13 浏览: 98
好的,这是一个比较复杂的问题,我会尽量为您解答。
首先,我们需要定义图的结构,包括边和顶点。对于带权有向图,我们可以定义一个结构体来表示边,包括起点、终点和权值:
```cpp
struct Edge {
int from, to, weight;
};
```
对于顶点,我们可以用整数来表示,例如从0开始编号。
接下来,我们可以定义邻接表类AdjGraph和邻接矩阵类MatGraph。这两个类都需要包含一个私有变量来存储图的大小(即顶点数),以及一个数组来存储边的信息。对于邻接表,我们可以用一个vector数组来存储每个顶点的邻居节点,每个邻居节点包括一个编号和一个权值;对于邻接矩阵,我们可以用一个二维数组来存储每两个顶点之间的边权值。
下面是AdjGraph类的定义:
```cpp
class AdjGraph {
private:
int size;
vector<pair<int, int>>* adj; // 邻接表数组,每个元素是一个vector,存储每个顶点的邻居节点
public:
AdjGraph(int n) {
size = n;
adj = new vector<pair<int, int>>[n];
}
void addEdge(int from, int to, int weight) {
adj[from].push_back(make_pair(to, weight));
}
void print() {
for (int i = 0; i < size; i++) {
cout << i << ": ";
for (auto& p : adj[i]) {
cout << "(" << p.first << ", " << p.second << ") ";
}
cout << endl;
}
}
};
```
下面是MatGraph类的定义:
```cpp
class MatGraph {
private:
int size;
int** matrix; // 邻接矩阵数组
public:
MatGraph(int n) {
size = n;
matrix = new int*[n];
for (int i = 0; i < n; i++) {
matrix[i] = new int[n];
memset(matrix[i], 0, sizeof(int) * n);
}
}
void addEdge(int from, int to, int weight) {
matrix[from][to] = weight;
}
void print() {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
};
```
接下来,我们可以根据边数组a创建邻接表G:
```cpp
int n = 5; // 顶点数
Edge a[] = {{0, 1, 1}, {1, 2, 2}, {2, 0, 3}, {2, 3, 4}, {3, 4, 5}};
int m = sizeof(a) / sizeof(a[0]); // 边数
AdjGraph G(n);
for (int i = 0; i < m; i++) {
G.addEdge(a[i].from, a[i].to, a[i].weight);
}
G.print();
```
输出结果为:
```
0: (1, 1)
1: (2, 2)
2: (0, 3) (3, 4)
3: (4, 5)
4:
```
然后,我们可以根据邻接表G创建邻接矩阵g:
```cpp
MatGraph g(n);
for (int i = 0; i < n; i++) {
for (auto& p : G.adj[i]) {
g.addEdge(i, p.first, p.second);
}
}
g.print();
```
输出结果为:
```
0 1 0 0 0
0 0 2 0 0
3 0 0 4 0
0 0 0 0 5
0 0 0 0 0
```
最后,我们可以根据邻接矩阵g创建邻接表G1:
```cpp
AdjGraph G1(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (g.matrix[i][j] != 0) {
G1.addEdge(i, j, g.matrix[i][j]);
}
}
}
G1.print();
```
输出结果为:
```
0: (1, 1)
1: (2, 2)
2: (0, 3) (3, 4)
3: (4, 5)
4:
```
这样,我们就完成了整个实验程序的设计。您可以根据自己的需求修改顶点数、边数组等信息进行测试。
阅读全文