引自免费微信小程序:皆我百晓生
这个C++程序是一个用于处理图的算法集合,包括创建邻接矩阵和邻接表、深度优先搜索(DFS)、广度优先搜索(BFS)以及Prim最小生成树算法。下面是详细的步骤描述:
-
包含头文件:
- 包含了
iostream
用于输入输出操作。 - 包含
malloc.h
和stdlib.h
,在C++标准库中已被cstdlib
替代,用于内存分配函数。 - 包含
stdio.h
,提供基本的输入输出功能。
- 包含了
-
定义常量和结构体:
- 定义最大顶点数
MAXV
和无穷大值INF
。 - 结构体
ANode
表示邻接表中的一个弧,包含指向下一个弧的指针、相邻顶点编号和权重。 - 结构体
Vnode
表示邻接表中的一个顶点,包含指向第一个弧的指针。 AdjGraph
结构体表示邻接表图,包含顶点数组和弧计数器。MatGraph
结构体表示邻接矩阵图,包含顶点数组、邻接矩阵和顶点计数器。SqQueue
结构体表示循环队列,包含队列数据存储和前后端索引。
- 定义最大顶点数
-
函数声明:
- 创建邻接表的函数
CreateAdj
。 - 创建邻接矩阵的函数
CreatGraph
。 - 广度优先搜索的函数
BFS
。 - 深度优先搜索的函数
DFS
。 - Prim最小生成树算法的函数
Prim
。 - 初始化队列的函数
InitQueue
。 - 将元素入队的函数
enQueue
。 - 判断队列是否为空的函数
QueueEmpty
。 - 出队并返回元素的函数
deQueue
。
- 创建邻接表的函数
-
主函数
main()
:- 定义变量
n
、e
和v
分别代表顶点数、边数和起始顶点。 - 初始化邻接矩阵
A
。 - 创建邻接表图
g
并填充数据。 - 进行深度优先搜索,并打印结果。
- 执行广度优先搜索,并打印结果。
- 创建邻接矩阵图
m
并填充数据。 - 执行Prim最小生成树算法,并打印结果。
- 定义变量
以下是整个程序的执行流程:
- 在
main()
中,首先定义了图的基本参数(顶点数n
、边数e
和起始顶点v
),然后初始化了一个邻接矩阵A
。 - 调用
CreateAdj
函数,将邻接矩阵转换成邻接表结构,并将结果存储在g
中。 - 调用
DFS
函数进行深度优先遍历,并打印结果。 - 调用
BFS
函数进行广度优先遍历,并打印结果。 - 同样地,调用
CreatGraph
函数将邻接矩阵转换成邻接矩阵图结构,并将结果存储在m
中。 - 最后,调用
Prim
函数计算最小生成树,并打印结果。
在代码运行过程中,会依次完成以下操作:
- 创建邻接表和邻接矩阵图的数据结构。
- 对给定的邻接矩阵执行深度优先搜索和广度优先搜索,展示从指定顶点开始的遍历路径。
- 计算并打印由Prim算法得出的最小生成树,即从起始顶点开始的具有最小总权重的边集,使得所有顶点构成一棵连通树。