洛谷P3366 【模板】最小生成树(kuskal)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=5005; 4 const int maxm=200005; 5 struct node{ 6 int cnt,fa; 7 }f[maxn]; 8 inline void read(int &tmp) 9 { 10 int x=1;char c=getchar(); 11 for(tmp=0;!isdigit(c);c=getchar()) if(c=='-') x=-1; 12 for(;isdigit(c);tmp=tmp*10+c-48,c=getchar()); 13 tmp*=x; 14 } 15 int find(int x) {return f[x].fa==x?x:f[x].fa=find(f[x].fa);} 16 void Union(int x,int y) 17 { 18 x=find(x),y=find(y);if(x==y) return; 19 if(f[x].cnt<f[y].cnt) {f[x].fa=y;f[y].cnt+=f[x].cnt;} 20 else {f[y].fa=x;f[x].cnt+=f[y].cnt;} 21 } 22 struct edge{ 23 int x,y,dis; 24 }d[maxm]; 25 inline bool cmp (const edge &a,const edge &b) {return a.dis<b.dis;} 26 int n,tot,m; 27 int main() 28 { 29 read(n),read(m); 30 for(int i=1;i<=n;i++) f[i].fa=i,f[i].cnt=1; 31 for(int i=1;i<=m;i++) read(d[i].x),read(d[i].y),read(d[i].dis); 32 sort(d+1,d+1+m,cmp); 33 for(int i=1;i<=m;i++) 34 { 35 if(f[find(1)].cnt==n) break; 36 if(find(d[i].x)!=find(d[i].y)) 37 Union(d[i].x,d[i].y),tot+=d[i].dis; 38 } 39 if(f[find(1)].cnt!=n) printf("orz"); 40 else printf("%d",tot); 41 return 0; 42 }