HDU-3038-How Many Answers Are Wrong [带权并查集]

来源:互联网 发布:矩阵理论答案 编辑:程序博客网 时间:2024/06/06 09:37

题目传送门


题意:
每输入一行x y s,表示[x,y]的和为s,求有多少行与前面的有冲突。
思路:
可以理解为y比x-1大s,就可以用带权并查集做。

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <queue>using namespace std;int N,M;int fa[200000+100], sum[200000+100];void init(){    for (int i = 0; i < 200000; i++)    {        fa[i]=i;        sum[i]=0;    }    return ;}int find(int x){    if (x==fa[x])return x;    int t = fa[x];    fa[x] = find(fa[x]);    sum[x] += sum[t];    return fa[x];}int main(void){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    while (~scanf("%d %d", &N, &M))    {        init();        int ans = 0;        while (M--)        {            int x, y, s;            scanf("%d %d %d", &x, &y, &s);            x--;            int a = find(x);            int b = find(y);            if (a==b && sum[x]!=sum[y]+s)            {                ans++;            }            else            {                if (a>b)                {                    fa[b] = a;                    sum[b] = sum[x]-s-sum[y];                }                else                {                    fa[a] = b;                    sum[a] = sum[y]+s-sum[x];                }            }        }        printf("%d\n",ans);    }    return 0;}
阅读全文
0 0
原创粉丝点击