您的位置:首页 > 其它

Kruskal算法求最小生成树

2016-04-13 20:31 567 查看
Kruskal算法是根据权来筛选节点,也是采用贪心算法。

///     Kruskal

///初始化每个节点为独立的点,他的祖先为自己本身
void made(int n) {
for(int i=0; i<=n; i++)
father[i]=i;        ///father[i]存的父亲的编号
}

///找x这个点的祖先
int find(int x) {
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}

///按权的大小排序
int cmp(const void *a,const void *b) {
tree *aa=(tree *)a;
tree *bb=(tree *)b;
return aa->val-bb->val;
}

///参数n为节点个数,m为权的个数
bool kru(int n,int m) {
int i,j;
qsort(p,m,sizeof(p[0]),cmp);
ans=0;
made(n);
int cnt=0;
for(i=0;i<m;i++)
{
int xx=find(p[i].x);
int yy=find(p[i].y);
if(xx==yy) continue;
father[yy]=xx;
ans+=p[i].val;
cnt++;
}
if(cnt!=n-1) return false;
else return true;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: