洛谷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 }

 

转载于:https://www.cnblogs.com/yu-xing/p/10262048.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值