首页 > 代码库 > HDU_3038_并查集

HDU_3038_并查集

http://acm.hdu.edu.cn/showproblem.php?pid=3038

 

并查集的应用,选择哪个点作为根结点都没关系,多了一个sum数组保存每个点到根节点的和,注意刚开始a减了1,才能把一组组都串起来。

注意,题目描述的是一组数据,但是实际是读到EOF。

 

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int pre[200005],sum[200005] = {0};int findd(int x){    if(x == pre[x]) return x;    int root = findd(pre[x]);    sum[x] += sum[pre[x]];    pre[x] = root;    return pre[x];}int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        int ans = 0;        memset(sum,0,sizeof(sum));        for(int i = 0;i <= n;i++)   pre[i] = i;        int a,b,c;        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            a--;            int x = findd(a),y = findd(b);            if(x != y)            {                pre[x] = y;                sum[x] = sum[b]+c-sum[a];            }            else            {                if(sum[a]-sum[b] != c) ans++;            }        }        printf("%d\n",ans);    }    return 0;}

 

HDU_3038_并查集