定义图的邻接矩阵存储结构,并编写图的初始化、建立图、输出图、深度优先遍历、计算并输出图中每个顶点的度等基本操作实现两数。以下两图为例 建立一个验证操作实现的主函数进行测试。
时间: 2023-12-30 20:02:57 浏览: 50
邻接表或者邻接矩阵为存储结构实现连通无向图的深度优先和广度优先遍历
3星 · 编辑精心推荐
这是一个比较复杂的问题,需要一定的篇幅来回答。我会尽力简明扼要地回答你的问题,但可能无法涵盖所有细节。如果你需要更详细的解释,请告诉我。
首先,定义图的邻接矩阵存储结构需要两个数组:
1. 一个二维数组 $G$,表示图的邻接矩阵。$G[i][j]$ 表示顶点 $i$ 和顶点 $j$ 之间是否有一条边。如果有边,则 $G[i][j]$ 的值为边的权值;如果没有边,则 $G[i][j]$ 的值为 0。
2. 一个一维数组 $V$,表示图中所有顶点。$V[i]$ 表示第 $i$ 个顶点的值。
接下来,我们可以编写图的初始化、建立图、输出图、深度优先遍历、计算并输出图中每个顶点的度等基本操作:
1. 初始化图:
```c++
#define MAXSIZE 100
int G[MAXSIZE][MAXSIZE]; // 邻接矩阵数组
int V[MAXSIZE]; // 顶点数组
int n; // 图中顶点数
// 初始化图
void init_graph() {
memset(G, 0, sizeof(G)); // 初始化邻接矩阵数组
memset(V, 0, sizeof(V)); // 初始化顶点数组
n = 0; // 初始化顶点数
}
```
2. 建立图:
```c++
// 添加一条边
void add_edge(int u, int v, int w) {
G[u][v] = w;
}
// 建立无向图
void build_graph() {
int m, u, v, w;
cin >> n >> m; // 输入顶点数和边数
for (int i = 0; i < n; i++) {
cin >> V[i]; // 输入顶点的值
}
for (int i = 0; i < m; i++) {
cin >> u >> v >> w; // 输入一条边的两个顶点和权值
add_edge(u, v, w);
add_edge(v, u, w); // 无向图需要添加两条边
}
}
```
3. 输出图:
```c++
// 输出邻接矩阵
void print_graph() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << G[i][j] << " ";
}
cout << endl;
}
}
// 输出顶点数组
void print_vertex() {
for (int i = 0; i < n; i++) {
cout << V[i] << " ";
}
cout << endl;
}
// 输出图
void print() {
cout << "邻接矩阵:" << endl;
print_graph();
cout << "顶点数组:" << endl;
print_vertex();
}
```
4. 深度优先遍历:
```c++
// 深度优先遍历
void dfs(int u, bool* visited) {
visited[u] = true; // 标记顶点 u 已被访问
cout << V[u] << " "; // 输出顶点 u
for (int v = 0; v < n; v++) {
if (G[u][v] && !visited[v]) { // 如果顶点 u 和顶点 v 之间有边且顶点 v 未被访问
dfs(v, visited); // 递归访问顶点 v
}
}
}
// 对图进行深度优先遍历
void dfs_traversal() {
bool visited[MAXSIZE]; // 记录每个顶点是否被访问过
memset(visited, false, sizeof(visited));
for (int u = 0; u < n; u++) {
if (!visited[u]) { // 如果顶点 u 未被访问过
dfs(u, visited); // 从顶点 u 开始深度优先遍历
}
}
cout << endl;
}
```
5. 计算并输出图中每个顶点的度:
```c++
// 计算顶点 u 的度
int degree(int u) {
int deg = 0;
for (int v = 0; v < n; v++) {
if (G[u][v]) { // 如果顶点 u 和顶点 v 之间有边
deg++; // 增加顶点 u 的度
}
}
return deg;
}
// 输出图中每个顶点的度
void print_degree() {
for (int u = 0; u < n; u++) {
cout << "顶点 " << V[u] << " 的度为 " << degree(u) << endl;
}
}
```
最后,我们可以编写一个验证操作实现的主函数进行测试:
```c++
int main() {
init_graph();
build_graph();
print();
dfs_traversal();
print_degree();
return 0;
}
```
希望这个回答能够帮助你!
阅读全文