版权声明:转载请保留原地址 https://blog.csdn.net/u012972031/article/details/82832317
不谈
直接上代码。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Edge{
int u,v;
int w;
};
Edge edgeArray[200000+5];
int pointFatherArray[5000+5];
int compareTo(Edge a,Edge b){
return a.w<b.w;
}
int find(int x){
return x==pointFatherArray[x]?x:pointFatherArray[x]=find(pointFatherArray[x]);
}
int kruskal(int pointAmount,int edgeAmount){
int totalWeight=0;
int totalEdgeAmount=0;//最小生成树的边数
for(int i=0;i<edgeAmount;i++){
Edge edge=edgeArray[i];
int uPointFather=find(edge.u);
int vPointFather=find(edge.v);
if(uPointFather==vPointFather)continue;
totalWeight+=edge.w;//注意 不要忘记加总权重啊
pointFatherArray[uPointFather]=vPointFather;
totalEdgeAmount++;
if(totalEdgeAmount==pointAmount-1){
return totalWeight;
}
}
return totalWeight;
}
int main(){
int pointAmount,edgeAmount;
scanf("%d%d",&pointAmount,&edgeAmount);
for(int i=0;i<edgeAmount;i++){
//Edge edge=edgeArray[i];
//cin>>edge.u>>edge.v>>edge.w; 注意 不要这样写!!
cin>>edgeArray[i].u>>edgeArray[i].v>>edgeArray[i].w;
}
for(int i=1;i<=pointAmount;i++){//不要忘记预处理pointFatherArray
pointFatherArray[i]=i;
}
sort(edgeArray,edgeArray+edgeAmount,compareTo);
int totalWeight=kruskal(pointAmount,edgeAmount);
cout<<totalWeight<<endl;
return 0;
}
怎么学呢?首先,看紫书,大概看懂之后,你可能是懵逼的。(像我一样)
接下来我们看一下代码。
…代码大概挺好懂的QAQ我就不解释了(其实是不知道咋解释)
由于这道题的特殊性(只需要求出总权值即可),所以我们直接扔了并查集压缩路径(就是让子结点的父结点直接设置为最大的父结点,这样访问子结点的最大的父结点就快了),也就是说我们结束之后没法输出最小生成树的样子。
某蒟蒻:那么我该怎么输出最小生成树的样子呢QAQ
zyc大佬:记录每一次留下的边