使用并查集实现
直接以边为目标构建最小生成树,构建时用并查集来考虑是否会形成环路
typedef struct
{
int begin;
int end;
int weight;
}Edge;
先根据边的权值排序,然后从最短边开始构造最小生成树
只要会并查集就很简单
void MiniSpanTree_Kruskal(MGraph)
{
int i,n,m;
Edge edge[MAXEDGE];
//边集数组
int parent[MAXVEX];
//集合用来判断边与边之间是否会形成环路
//此处省略排序过程
for(int i = 0; i < G.numVertexes; i ++)
parent[i] = 0;
for(int i = 0; i < G.numVertexes; i ++ ) //循环每一条边
{
int n = Find(parent,edge[i].begin);
int m = Find(parent,edge[i].end);
//查找每条边的终点和起点所属的集合
if( n != m)
{
parent[n] = m;
//将次边的结尾节点加入到下标为起点的parent中
//表示此节点已经加入到生成树中
printf("(%d,%d) %d",edge[i].begin,edge[i].end,edge[i].weight);
//也可以用一个数组存放路径
}
}
}
int Find(int *parent,int f) //路径压缩
{
while(parent[f] > 0)
f = parent[f];
return f;
}
kruskal算法
最新推荐文章于 2023-10-19 13:04:42 发布