hdu 3038 How Many Answers Are Wrong(并查集)

来源:互联网 发布:linux lcd 设备文件 编辑:程序博客网 时间:2024/05/24 15:43

题目大意:

给出m个询问,问【l,r】之间的和   ,求出有多少次询问不和之前的矛盾的。


思路分析:

用并查集记录当前节点到根节点的和。



#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define maxn 222222using namespace std;int set[maxn];int sum[maxn];int find(int x){    if(x!=set[x])    {        int f=set[x];        set[x]=find(set[x]);        sum[x]+=sum[f];    }    return set[x];}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<=n;i++)set[i]=i,sum[i]=0;        int ans=0;        while(m--)        {            int l,r,s;            scanf("%d%d%d",&l,&r,&s);            l--;            int xx=find(l);            int yy=find(r);            if(xx==yy)            {                if(sum[l]-sum[r]!=s)ans++;            }            else            {                set[xx]=yy;                sum[xx]=sum[r]-sum[l]+s;            }        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击