您的位置:首页 > 其它

最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合

2016-10-14 20:34 447 查看
//最小生成树

//输入边 定义边节点

//kruskal算法

//map 的struct需要定义< 符号 ,那么set也应该是这样但是数组可以不用

#include<cstdio>

#include<iostream>

#include<algorithm>

using namespace std;

const int maxn=1000;

int num;//边数

struct Node{

int r,l,e;

bool operator < (const Node& rhs) const{

return e<rhs.e;

}

}node[maxn];

int ufs[maxn];

int ans=0;

int find(int u){

return ufs[u]==u? u:ufs[u]=find(ufs[u]);

}

void Kruskal(){

sort(node,node+num);

for(int i=0;i<maxn;i++)ufs[i]=i;//自连通

for(int i=0;i<num;i++){

int x=find(node[i].l);

int y=find(node[i].r);

if(x!=y){

ans+=node[i].e;

printf("edge start with %d,end with %d, length %d\n",node[i].l,node[i].r,node[i].e);

ufs[x]=y;

}

}

}

int main(){

//输入树节点,起点,终点,边权

cout<<"input the num of the edge of the tree:\n";

cin>>num;

cout<<"for the next n lines input as a-the begin b-the end e-the length:\n";

for(int i=0;i<num;i++){

cin>>node[i].l>>node[i].r>>node[i].e;

}

//kruskal算法求最小生成树并打印最小生成树

Kruskal();

printf("The smallest:%d",ans);

return 0;

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