最小生成树-Kruskal
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int MAXN=100010; 6 7 struct Blanket 8 { 9 int area1,area2; 10 int beauty; 11 }b[MAXN]; 12 inline bool cmp(Blanket a,Blanket b) {return a.beauty>b.beauty;} 13 14 int head[MAXN]; 15 int root(int x) 16 { 17 if (head[x]==x) return x; 18 return head[x]=root(head[x]); 19 } 20 21 int main() 22 { 23 int n,m,k; 24 cin>>n>>m>>k; 25 26 int cnt=0; 27 for (int i=1;i<=m;i++) 28 { 29 cnt++; 30 cin>>b[cnt].area1>>b[cnt].area2>>b[cnt].beauty; 31 } 32 sort(b+1,b+cnt+1,cmp); 33 34 for (int i=1;i<=n;i++) head[i]=i; 35 int t=0,ans=0; 36 for (int i=1;i<=m;i++) 37 { 38 if (head[root(b[i].area1)]!=root(b[i].area2)) 39 { 40 head[root(b[i].area1)]=root(b[i].area2); 41 ans+=b[i].beauty; 42 t++; 43 if (t==k) break; 44 } 45 } 46 cout<<ans<<endl; 47 48 return 0; 49 }