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;
}
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;
}