Kruskal算法

本文介绍了一种使用Kruskal算法寻找最小生成树的方法。通过定义一个包含特定数量节点的集合,并利用最小堆来存储图中的所有边。该算法逐步构建最小生成树,确保加入的每条边不会形成环路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

template<class EdgeType>
Edge<EdgeType> *AdjGraph<EdgeType>::Kruskal()
{
int n=vertexNum;
UFSets set(n);//定义n个结点的集合
Edge<EdgeType> *MST=new Edge<EdgeType>[n-1];//记录最小生成树的边
MinHeap<Edge<EdgeType>> H(edgeNum);//定义含有edgeNum个元素的最小堆,edgeNum是图中边的个数
Edge<EdgeType> edge;
for(int i=0;i<n;i++)//将图中所有的边记录在堆H中
{
for(edge=firstEdge(i);isEdge(edge);edge=nextEdge(edge))
{
if(edge.start<edge.end)
{
H.insert(edge);
}
}
}
int EdgeNum=0;//e是生成树中边的个数
while(EdgeNum<n-1)//n个结点的连通图的生成树有n-1条边
{
if(!H.isEmpty())
{
edge=H.removeMin();//找到权重最小的未处理边
int v=edge.start;
int u=edge.end;
if(set.root[v]!=set.root[u])//判断该边关联的点是否在一个连通分量
{
set.Union(v,u);//合并两个顶点所在的等价类
MST[EdgeNum]=edge;//将符合条件的边加到生成树的边集合中
EdgeNum++;
}
}
else
{
assert("不存在最小生成树");
}
}
return MST;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值