最大生成树模板
最大生成树是通过先对边权进行一个排序,然后对排序后的边权进行提取,看两端的点是否联通,也就是利用并查集进行一个优化,如果两点还未在同一个集合里面,则累加边权到最后的答案,合并两个点即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
const int N=5e5+1000;
struct node{
ll x,y,w;
}Node[N];
ll fa[N],n,m;
bool cmp(node a,node b){
return a.w>b.w;
}
ll find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
cin>>Node[i].x>>Node[i].y>>Node[i].w;
}
sort(Node+1,Node+1+m,cmp);
ll ans=0;
for(int i=1;i<=m;i++){
int fx=find(Node[i].x),fy=find(Node[i].y);
if(fx==fy) continue;
ans+=Node[i].w;
fa[fx]=fy;
}
cout<<ans<<endl;
return 0;
}