zoukankan      html  css  js  c++  java
  • bzoj 1202: [HNOI2005]狡猾的商人

     1 #include<cstdio>
     2 #include<iostream>
     3 #define M  1005
     4 using namespace std;
     5 int fa[M],T,n,m,v[M],kg;
     6 int zhao(int a1)
     7 {
     8     if(fa[a1]==a1)
     9       return a1;
    10     int  t=zhao(fa[a1]);
    11     v[a1]+=v[fa[a1]];
    12     fa[a1]=t;
    13     return t;
    14 }
    15 int main()
    16 {
    17     scanf("%d",&T);
    18     for(;T;T--)
    19       {
    20         scanf("%d%d",&n,&m);
    21         for(int i=0;i<=n;i++)
    22           {
    23             fa[i]=i;
    24             v[i]=0;
    25           }
    26         kg=1;
    27         for(int i=1;i<=m;i++)
    28           {
    29             int a1,a2,a3,x,y;
    30             scanf("%d%d%d",&a1,&a2,&a3);
    31             x=zhao(a1-1);
    32             y=zhao(a2);
    33             if(x!=y)
    34               {
    35                 fa[y]=x;
    36                 v[y]=v[a1-1]+a3-v[a2];
    37                   }
    38             else if(v[a2]-v[a1-1]!=a3)
    39                    kg=0;
    40           }
    41         if(kg)
    42           printf("true
    ");
    43         else
    44           printf("false
    ");
    45       }
    46     return 0;
    47 }

    这好像是一个差分约束,用前缀和数组与读入的条件建边,发现所有的条件都是等于,所以可以用并查集维护,维护到祖先节点的距离。

  • 相关阅读:
    线性最大子数组的求法(二)
    高难度智力题
    职业规划
    良好的学习习惯
    毕业生面试绝招
    编写Java程序最容易犯的21种错误
    spring02
    spring_01
    用soapUI生成客户端代码
    idea创建git分支
  • 原文地址:https://www.cnblogs.com/xydddd/p/5240474.html
Copyright © 2011-2022 走看看