胡队长带领HA实验的战士们玩真人CS,真人CS的地图由一些据点组成,现在胡队长已经占领了n个据点,为了方便,将他们编号为1-n,为了隐蔽,胡队长命令战士们在每个据点出挖一个坑,让战士们躲在坑里。由于需要在任意两个点之间传递信息,两个坑之间必须挖出至少一条通路,而挖沟是一件很麻烦的差事,所以胡队长希望挖出数量尽可能少的沟,使得任意两个据点之间有至少一条通路,顺便,尽可能的∑d[i][j]使最小(其中d[i][j]为据点i到j的距离)。
输入描述:
第一行有2个正整数n,m,m表示可供挖的沟数。
接下来m行,每行3个数a,b,v,每行描述一条可供挖的沟,该沟可以使a与b连通,长度为v。
输出描述:
输出一行,一个正整数,表示要使得任意两个据点之间有一条通路,至少需要挖长的沟。(数据保证有解)

思路
最小生成树裸题。。用kruskal算法对边进行排序,然后取最小值连边即可,连边用并查集维护

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int f[N];
struct Edge{int from,to,v;}e[N*5];
int find(int x){
    return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++){
        int x,y,d;cin>>x>>y>>d;
        e[i]={x,y,d};
    }
    sort(e+1,e+m+1,[](Edge a,Edge b){
           return a.v<b.v; 
    });
    int ans=0;
    for(int i=1;i<=m;i++){
        int fx=find(e[i].from);
        int fy=find(e[i].to);
        if(fx!=fy){
            ans+=e[i].v;
            f[fx]=fy;
        }
    }
    cout<<ans;
    return 0;
}