hdoj3038 // 算术并查集

#include<iostream>  
#include<cstdio>  
#include<map>  
#include<cstring>  
#include<cmath>  
#include<vector>  
#include<algorithm>  
#include<set>  
#include<string>  
#include<queue>  
#define inf 1<<30  
#define M 60005  
#define N 10005  
#define maxn 300005  
#define eps 1e-10  
#define zero(a) fabs(a)<eps  
#define Min(a,b) ((a)<(b)?(a):(b))  
#define Max(a,b) ((a)>(b)?(a):(b))  
#define pb(a) push_back(a)  
#define mem(a,b) memset(a,b,sizeof(a))  
#define LL long long  
#define lson step<<1  
#define rson step<<1|1  
#define MOD 1000000009  
#define sqr(a) ((a)*(a))  
using namespace std;  
int n,m;  
int pre[200005];  
int sum[200005];  
int find(int x)  
{  
    if(x!=pre[x])  
    {  
        int f=pre[x];  
        pre[x]=find(pre[x]);  
        sum[x]+=sum[f];  
    }  
    return pre[x];  
}  
int main()  
{  
    while(scanf("%d%d",&n,&m)!=EOF)  
    {  
        for(int i=0;i<=n;i++) pre[i]=i,sum[i]=0;  
        int ans=0;  
        while(m--)  
        {  
            int l,r,s;  
            scanf("%d%d%d",&l,&r,&s);  
            l--;  
            int ra=find(l),rb=find(r);  
            if(ra==rb)  
            {  
                if(sum[l]-sum[r]!=s) ans++;  
            }  
            else  
            {  
                pre[ra]=rb;  
                sum[ra]=sum[r]-sum[l]+s;  //ra->rb
            }  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值