码迷,mamicode.com
首页 > 其他好文 > 详细

最小生成树-kruskal

时间:2018-06-07 17:54:31      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:void   info   image   技术分享   组类型   最小   parent   克鲁斯   amp   

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

标签:void   info   image   技术分享   组类型   最小   parent   克鲁斯   amp   

原文地址:https://www.cnblogs.com/ccqqbb/p/9151663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!