您的位置:首页 > 其它

最小生成树之克鲁斯卡尔算法

2013-10-25 13:51 369 查看
克鲁斯卡尔算法思想:

1.有个Struct定义边的信息.

2.通过并查集和排序找得到最小权值(函数:1.UFset,2.Find,3.Union。)

3.找到权值的最小值的父亲关系相同放弃,否拿下Kruskal;
4.一直把所有的点合成通过连通分量。

#define Max 2000000
#define Maxn 2000
struct edge
{
int u,v;
int w;
}edges[Max];

int parent[Maxn];
int n,m;
int i,j;
void UFset()
{
for(i=0;i<=n;i++)
parent[i]=i;
}
int Find(int x)
{
if(x!=parent[x])
parent[x]=Find(parent[x]);
return parent[x];
}
void Union(int R1,int R2)
{

int r1=Find(R1);
int r2=Find(R2);
parent[r1]=r2;
}
int cmp(const void * a,const void * b)
{
return (*(struct edge *)a).w - (*(struct edge *)b).w;
}
int Kruskal()
{
int sumweight=0;
int num=0;
int u,v;
UFset();
for(i=0;i<m;i++)
{
u=edges[i].u;
v=edges[i].v;

if(Find(u)!=Find(v))
{

sumweight+=edges[i].w;
num++;
Union(u,v);
}
if(num>=n-1)break;

}
return sumweight;
}
qsort(edges,m,sizeof(edges[0]),cmp);


通俗来说:从小到大的边权值寻找,一路不重复地加入新的最小权值,直到当前所有的点num大于n点加提前结束完。(当前是最优)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 kruskal