定义图的邻接矩阵存储结构,并编写图的初始化、建立图、输出图、深度优先遍历、计算并输出图中每个顶点单度蹬操作实现代码
时间: 2023-08-11 16:03:44 浏览: 117
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
以下是一个基于C++的邻接矩阵存储图及其基本操作的代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
class Graph {
private:
int n; // 图中顶点数
vector<vector<int>> adj; // 邻接矩阵
public:
// 构造函数
Graph(int n) {
this->n = n;
adj.resize(n, vector<int>(n, 0));
}
// 添加边
void addEdge(int u, int v, int w) {
adj[u][v] = w;
adj[v][u] = w; // 对于无向图,需添加两次
}
// 深度优先遍历
void dfs(int u, vector<bool>& visited) {
visited[u] = true;
cout << u << " ";
for (int v = 0; v < n; v++) {
if (adj[u][v] != 0 && !visited[v]) {
dfs(v, visited);
}
}
}
// 计算单度顶点数
int getSingleDegree() {
int count = 0;
for (int i = 0; i < n; i++) {
int degree = 0;
for (int j = 0; j < n; j++) {
if (adj[i][j] != 0) {
degree++;
}
}
if (degree == 1) {
count++;
}
}
return count;
}
// 输出图
void printGraph() {
cout << "Graph:" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << adj[i][j] << " ";
}
cout << endl;
}
}
};
// 初始化图
Graph initGraph() {
int n, m; // n为顶点数,m为边数
cout << "Input number of vertices and edges: ";
cin >> n >> m;
Graph g(n);
cout << "Input edges: (u, v, w)" << endl;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
g.addEdge(u, v, w);
}
return g;
}
int main() {
Graph g = initGraph();
g.printGraph();
cout << "Single degree vertices: " << g.getSingleDegree() << endl;
cout << "DFS traversal: ";
vector<bool> visited(g.n, false);
g.dfs(0, visited);
cout << endl;
return 0;
}
```
上述代码中,我们定义了一个Graph类来表示邻接矩阵存储的图,并实现了图的初始化、建立图、输出图、深度优先遍历、计算单度顶点数等基本操作。其中,初始化图的函数initGraph()从标准输入中读取顶点数和边数,然后根据给定的边建立图。在main函数中,我们首先调用initGraph()函数初始化图,然后输出图的邻接矩阵表示,计算并输出单度顶点数,最后进行深度优先遍历,并输出遍历结果。
注意,上述代码中的dfs()函数和getSingleDegree()函数分别实现了深度优先遍历和计算单度顶点数的功能,你可以根据自己的需要进行修改和扩展。
阅读全文