hdu 3038 并查集

题目:给出一些询问,[l,r]的和为s,问有多少个是错的

 1 //并查集 ,,sum[a]表示a与父亲这条路径上的和

 2 #include <iostream>

 3 #include <cstdio>

 4 #include <cstring>

 5 #include <algorithm>

 6 

 7 using namespace std;

 8 

 9 const int maxn = 2e5 + 5;

10 int fa[maxn], sum[maxn];

11 int n, m, l, r, s;

12 int findFa(int x){

13     if (x != fa[x]){

14         int t = fa[x];

15         fa[x] = findFa(fa[x]);

16         sum[x] += sum[t];

17     }

18     return fa[x];

19 }

20 int main(){

21     while (~scanf("%d%d", &n, &m)){

22         for (int i = 0; i <= n; ++i){

23             fa[i] = i;

24             sum[i] = 0;

25         }

26         int ans = 0;

27         while (m--){

28             scanf("%d%d%d", &l, &r, &s);

29             l --;

30             int pa = findFa(l), pb = findFa(r);

31             if (pa == pb){

32                 if (sum[r] - sum[l] != s) ans++;

33             }

34             else {

35                 fa[pb] = pa;

36                 sum[pb] = sum[l] - sum[r] + s;

37             }

38         }

39         printf("%d\n", ans);

40     }

41     return 0;

42 }

 

你可能感兴趣的:(HDU)