P3366 【模板】最小生成树 (Kruskal)

 1 #define IO std::ios::sync_with_stdio(0)
 2 #include <bits/stdc++.h>
 3 #define pb push_back
 4 using namespace std;
 5 typedef long long ll;
 6 const int N=2e5+5;
 7 const int inf=2147483647;
 8 
 9 int n,m;
10 
11 struct node{
12     int u,v,w;
13 }a[N];
14 
15 int fa[N];
16 
17 int find(int x){
18     return x==fa[x]?x:fa[x]=find(fa[x]);
19 }
20 
21 bool cmp(node p,node q){
22     return p.w<q.w;
23 }
24 
25 int Kruskal(){
26     sort(a+1,a+1+m,cmp);
27     int cnt=0,ans=0;
28     for(int i=1;i<=n;i++)fa[i]=i;
29     for(int i=1;i<=m;i++){
30         int x=a[i].u;
31         int y=a[i].v;
32         x=find(x);
33         y=find(y);
34         if(x!=y){
35             ans+=a[i].w;
36             fa[x]=y;
37             cnt++;
38         }
39         if(cnt==n-1)return ans;
40     }
41     return -1;
42     
43 }
44 
45 int main(){
46     IO;
47     cin>>n>>m;
48     for(int i=1;i<=m;i++){
49         cin>>a[i].u>>a[i].v>>a[i].w;
50     }
51     int ans=Kruskal();
52     if(ans==-1)cout<<"orz"<<endl;
53     else cout<<ans<<endl;
54 }