hdu 3047 Zjnu Stadium 带权并查集

 1 #include<cstdio>
 2 #include<cmath>
 3 using namespace std;
 4 
 5 const int maxn = 50005;
 6 int f[maxn], rank[maxn];
 7 int n, m;
 8 
 9 void init(){
10     for (int i = 0; i <= n; ++i){
11         f[i] = i;
12         rank[i] = 0;
13     }
14     return;
15 }
16 
17 int find(int x){
18     if (x == f[x])
19         return f[x];
20     int t = f[x];
21     f[x] = find(f[x]);
22     rank[x] += rank[t];        //把父辈的加起来
23     return f[x];
24 }
25 
26 bool Union(int x, int y, int m){
27     int a = find(x);
28     int b = find(y);
29     if (a == b){
30         if (rank[x] + m != rank[y])
31             return false;
32         return true;
33     }
34     f[b] = a;
35     rank[b] = rank[x] + m - rank[y];
36     return true;
37 }
38 
39 int main(){
40     int a, b, x;
41     while (~scanf("%d%d", &n, &m)){
42         init();
43         int cnt = 0;
44         for (int i = 0; i<m; ++i){
45             scanf("%d%d%d", &a, &b, &x);
46             if (!Union(a, b, x)){
47                 cnt++;
48             }
49         }
50         printf("%d\n", cnt);
51     }
52     return 0;
53 }

 

转载于:https://www.cnblogs.com/ouyang_wsgwz/p/7862000.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值