zoukankan      html  css  js  c++  java
  • 并查集(区间和的合理性判断)

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

     1 /*
     2 题意:
     3 对于特定的一个长n的数字序列,给出m个条件,形式为:a b sum意义如下
     4 [a,b]闭区间里的所有数字的和为sum
     5 问这m个条件中有多少不合理的。如
     6 1 5 10
     7 6 10 20
     8 1 10 20
     9 这3个条件中第三个为不合理的,因为由前两个的可以知道1 10为30
    10 (注:先出现的视为合理,我们不说1 5 10不合理)
    11 */
    12 #include <iostream>
    13 #include <cstdio>
    14 #include <cstring>
    15 using namespace std;
    16 const int Ni = 200000+10;
    17 int p[Ni];
    18 int sum[Ni];
    19 int finds(int i)
    20 {
    21     if(p[i]==i) return i;
    22     int t=finds(p[i]);
    23     sum[i]+=sum[p[i]];
    24     return p[i]=t;
    25 }
    26 int main()
    27 {
    28     int n,m,i;
    29     int a,b,ans;
    30     int fa,fb,num;
    31     while(~scanf("%d%d",&n,&m))
    32     {
    33         for(i=0;i<=n;i++) p[i]=i;
    34         memset(sum,0,sizeof(int)*(n+2));
    35         ans=0;
    36         for(i=0;i<m;i++)
    37         {
    38            scanf("%d%d%d",&a,&b,&num);a--;
    39            fa=finds(a);fb=finds(b);
    40            if(fa==fb)
    41            {
    42                int temp=(sum[b]-sum[a]);
    43                if(temp!=num) ans++;
    44            }
    45            else
    46            {p[fb]=fa;sum[fb]=sum[a]-sum[b]+num;}
    47         }
    48         printf("%d\n",ans);
    49     }
    50     return 0;
    51 }

    10 5
    1 10 100
    7 10 28
    1 3 32
    4 6 41
    6 6 1
    10 3
    1 10 20
    1 10 30
    1 10 30

    ans:
    1
    2

  • 相关阅读:
    工厂模式一
    面向对象的简单理解二
    工厂模式三
    线程的简单学习
    nyoj35 表达式求值
    nyoj305 表达式求值
    poj1298 The Hardest Problem Ever
    poj1363 Rails
    hdu2036 改革春风吹满地
    nyoj467 中缀式变后缀式
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2606643.html
Copyright © 2011-2022 走看看