洛谷P2820 局域网
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=505; 4 const int maxm=100005; 5 int n,k,sum,tot; 6 struct node{ 7 int cnt,fa; 8 }f[maxn]; 9 int find(int x){return f[x].fa==x?x:f[x].fa=find(f[x].fa);} 10 void Union(int x,int y) 11 { 12 x=find(x),y=find(y);if(x==y) return; 13 if(f[x].cnt<=f[y].cnt) {f[x].fa=y;f[y].cnt+=f[x].cnt;} 14 else {f[y].fa=x;f[x].cnt+=f[y].cnt;} 15 } 16 struct edge{ 17 int x,y,dis; 18 }E[maxm]; 19 inline bool cmp(const edge &a,const edge &b) {return a.dis<b.dis;} 20 int main() 21 { 22 scanf("%d%d",&n,&k); 23 for(int i=1;i<=k;i++) scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].dis),sum+=E[i].dis; 24 for(int i=1;i<=n;i++) f[i].fa=i,f[i].cnt=1; 25 sort(E+1,E+1+k,cmp); 26 for(int i=1;i<=k;i++) 27 { 28 if(f[find(1)].cnt==n) break; 29 if(find(E[i].x)!=find(E[i].y)) Union(E[i].x,E[i].y),tot+=E[i].dis; 30 } 31 printf("%d",sum-tot); 32 return 0; 33 }