最小生成树-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的主要内容,如果未能解决你的问题,请参考以下文章

图的最小生成树算法(Prim和Kruskal)

最小生成树之Kruskal算法和Prim算法

最小生成树-Prim算法与Kruskal算法

最小生成树算法Kruskal算法Prim算法切分定理贪心算法

[图] 最小生成树-Prime算法和Kruskal算法

最小生成树算法详解(prim+kruskal)