HDU - 3038(并查集)How Many Answers Are Wrong

这是一个带权的并查集,给你区间和的信息,然后让你判断哪些信息是错的,先将没确定的(没在一个集合的)区间加到一个集合里,如果这两个区间在一个集合,即被确定了,然后跟题上给的信息进行对比如果不一样就说明这条信息是错误的ans就++。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <iostream>
#define PI 3.1415926535898
#define LL long long
#define MAX 0x3fffffff
#define INF 0x3f3f3f3f
#define mem(a,v) memset(a,v,sizeof(a))
const int MAX_N = 2e5+10;
const double eps = 1e-7;
const LL mod = 1000000007;
const LL inf = 1LL<<60;
using namespace std;
int fa[MAX_N],val[MAX_N];
int Find(int x)
{
    if(x == fa[x])
        return fa[x];
    int fx = fa[x];
    fa[x] = Find(fa[x]);
    val[x]+=val[fx];
    return fa[x];
}
int main()
{
    int N,M;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        memset(val,0,sizeof(val));
        for(int i = 0;i <= N;i++)
            fa[i] = i;
        int ans = 0;
        int u,v,w;
        for(int i = 0;i < M;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            u--;
            int fx = Find(u);
            int fy = Find(v);
            if(fx!=fy)
            {
                fa[fy] = fx;
                val[fy] = w+val[u]-val[v];
                //cout<<val[fy]<<endl;
            }
            else if(val[v]-val[u]!=w)
                ans++;
        }
        cout<<ans<<endl;
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值