建立图的存储结构(图的类型是有向图、无向图、有向网、无向网,),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵,邻接表等。可以实现图的某种功能,比如(最短路径等)C++实现
时间: 2024-05-04 17:18:43 浏览: 145
弧或边带权的图分别称作有向网或无向网。-数据结构导论中第5章 图课件
以下是C++实现图的存储和操作的示例代码,包括邻接矩阵和邻接表两种存储结构。其中,图的类型是无向图和无向网。
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100; // 最大顶点数
// 图的邻接矩阵存储结构
class AdjMatrixGraph {
public:
AdjMatrixGraph(int n = 0, bool directed = false) {
this->n = n;
this->directed = directed;
memset(g, 0, sizeof(g));
}
// 添加一条边
void addEdge(int u, int v, int w = 1) {
g[u][v] = w;
if (!directed) {
g[v][u] = w;
}
}
// 输出邻接矩阵
void print() {
cout << "Adjacency Matrix:" << endl;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << g[i][j] << " ";
}
cout << endl;
}
}
private:
int n; // 顶点数
bool directed; // 是否为有向图
int g[MAXN][MAXN]; // 邻接矩阵
};
// 图的邻接表存储结构
class AdjListGraph {
public:
struct Edge {
int v, w; // 边的终点和权值
Edge(int _v, int _w) : v(_v), w(_w) {}
};
AdjListGraph(int n = 0, bool directed = false) {
this->n = n;
this->directed = directed;
adj.resize(n + 1);
}
// 添加一条边
void addEdge(int u, int v, int w = 1) {
adj[u].push_back(Edge(v, w));
if (!directed) {
adj[v].push_back(Edge(u, w));
}
}
// 输出邻接表
void print() {
cout << "Adjacency List:" << endl;
for (int i = 1; i <= n; i++) {
cout << i << ": ";
for (int j = 0; j < adj[i].size(); j++) {
cout << "(" << adj[i][j].v << "," << adj[i][j].w << ") ";
}
cout << endl;
}
}
private:
int n; // 顶点数
bool directed; // 是否为有向图
vector<vector<Edge>> adj; // 邻接表
};
int main() {
// 创建无向图
AdjMatrixGraph g1(5);
g1.addEdge(1, 2);
g1.addEdge(1, 4);
g1.addEdge(2, 3);
g1.addEdge(2, 4);
g1.addEdge(2, 5);
g1.addEdge(3, 5);
g1.print();
AdjListGraph g2(5);
g2.addEdge(1, 2);
g2.addEdge(1, 4);
g2.addEdge(2, 3);
g2.addEdge(2, 4);
g2.addEdge(2, 5);
g2.addEdge(3, 5);
g2.print();
// 创建无向网
AdjMatrixGraph g3(5, true);
g3.addEdge(1, 2, 5);
g3.addEdge(1, 4, 10);
g3.addEdge(2, 3, 3);
g3.addEdge(2, 4, 1);
g3.addEdge(2, 5, 8);
g3.addEdge(3, 5, 6);
g3.print();
AdjListGraph g4(5, true);
g4.addEdge(1, 2, 5);
g4.addEdge(1, 4, 10);
g4.addEdge(2, 3, 3);
g4.addEdge(2, 4, 1);
g4.addEdge(2, 5, 8);
g4.addEdge(3, 5, 6);
g4.print();
return 0;
}
```
上述代码中,我们实现了邻接矩阵和邻接表两种存储结构,并分别创建了无向图和无向网。对于邻接矩阵,我们使用二维数组 `g` 来存储图的边信息,其中 `g[i][j]` 表示顶点 `i` 和顶点 `j` 之间的边权值。对于邻接表,我们使用 `vector` 数据结构来存储每个顶点的邻接点信息,其中 `adj[i]` 表示顶点 `i` 的邻接点集合。在添加边时,我们分别在邻接矩阵和邻接表中添加边的信息。在输出时,我们分别输出邻接矩阵和邻接表中的信息。
阅读全文