最小生成树-kruskal
Posted ccqqbb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树-kruskal相关的知识,希望对你有一定的参考价值。
prim算法是以顶点为起点,kruskal是找权值最小的边来构建,下面是主要代码
边数组类型:
struct Edge
{
int begin; //起始点
int end; //结束点
int weight; //权值
};
以上面图为例,生成一个排序好的边数组,如右图
对边数组进行排序的代码为:
void EdgeSort(Edge *edge)
{
int i,j,m = 0;
for(i = 0;i<NumVertex;i++)
{
for(j = 0;j<NumVertex;j++)
{
if(Edges[i][j] != 0 && Edges[i][j] != MAX_COST)
{
edge[m].begin = i;
edge[m].end = j;
edge[m].weight = Edges[i][j];
m++;
Edges[j][i] = 0;
}
}
}
Edge t;
for(i = 0;i<m;i++)
{
for(j = 0;j<m-i-1;j++)
{
if(edge[j].weight > edge[j+1].weight)
{
t = edge[j];
edge[j] = edge[j+1];
edge[j+1] = t;
}
}
}
}
下面代码为克鲁斯卡尔算法代码
int Find(int *parent,int f)
{
while(parent[f] > 0)
f = parent[f];
return f;
}
void Kruskal()
{
int i,j;
int m ,n;
Edge *edge = new Edge[NumEdge];
int *parent = new int[NumVertex];
EdgeSort(edge);
for( i = 0;i<NumVertex;i++)
parent[i] = 0;
for(i = 0;i<NumEdge;i++)
{
n = Find(parent,edge[i].begin);
m = Find(parent,edge[i].end);
if(m != n)
{
parent[n] = m;
cout<<edge[i].begin<<"-"<<edge[i].end<<":"<<edge[i].weight<<endl;
}
}
}
以上是关于最小生成树-kruskal的主要内容,如果未能解决你的问题,请参考以下文章