#include stdioh#include stdlibh#define MAX_VERTEX_NUM 100 最大顶点数#define MAX_EDGE_NUM 100 最大边数边结构体typedef struct int tail; 边的起点 int head; 边的终点 int weight; 边的权值 Edge;图结构体typedef struct int
本代码实现了破圈法求解最小生成树,主要包括以下几个部分:
- 定义边结构体
边结构体包括边的起点、终点和权值三个属性。
- 定义图结构体
图结构体包括顶点数、边数和边数组三个属性。
- 定义并查集结构体
并查集结构体包括父节点数组和秩数组两个属性。
- 初始化并查集
MakeSet函数用于初始化并查集,将每个节点的父节点设为自己,秩设为0。
- 查找节点所在集合的代表元
Find函数用于查找节点所在集合的代表元,采用路径压缩优化。
- 合并两个集合
Union函数用于合并两个集合,采用按秩合并优化。
- 边比较函数
cmp函数用于边的排序,按权值从小到大排序。
- 破圈法求最小生成树
Kruskal函数用于破圈法求最小生成树。首先按权值从小到大排序,然后遍历所有边,如果边的两个端点不在同一个集合中,说明不会形成环,可以加入最小生成树中;否则,删除边。最后输出加入最小生成树的边和删除的边。
- 主函数
主函数用于输入顶点数、边数和每条边的起点、终点和权值,然后调用Kruskal函数求解最小生成树。
总体来说,本代码实现了破圈法求解最小生成树,采用并查集维护集合,时间复杂度为O(mlogn),其中n为顶点数,m为边数
原文地址: https://www.cveoy.top/t/topic/gCLz 著作权归作者所有。请勿转载和采集!