const int MAXN=inf;
int f[MAXN]; //f[i]表示i的父亲节点(是否有同一个父亲)或是否在同一个集合;
struct note{
int u,v,w;
}d[]; //边的信息,u,v——端点,w——权值;
int n,m; //n——点数,m——边数
int ans; //权值和
bool cmp(const note &a,const note &b){
return a.w<b.w;//按照权值大小排序;也可写作bool cmp(node a,node b){return a.w<b.w};
}
int find(int s){
if(s!=f[s]) f[s]=find(f[s]);
return f[s];//并查集;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) p[i]=i;//初始化;
for(int i=1;i<=m;i++) scanf("%d%d%d",&d[i].u,&d[i].v,&d[i].w);//利用结构体读入;
sort(d+1,d+1+n,cmp);
for(int i=1;i<=m;i++){
int e,r;
e=find(d[i].u);
r=find(d[i].v);
if(e!=r)//判断是否在同一个集合;
p[r]=e,ans+=d[i].w; //合并操作以及最小生成树的建立;
}
printf("%d",ans);
return 0;//输出部分;程序结束;
}
kruskal
最新推荐文章于 2023-10-19 13:04:42 发布