zoukankan      html  css  js  c++  java
  • hdoj 1829 A bug's life 种类并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829

    并查集的一个应用,就是检测是否存在矛盾,就是两个不该相交的集合有了交集。本题就是这样,一种虫子有两种性别,每次m次操作,每次给出(a,b),如果a和b是同性别就出现了错误,也就是说出现了判断它有两种性别的错误。我的策略同样是两个集合,用并查集维护两个集合之间的关系。具体证明请看我的上一篇博客,关于这种做法的正确性的证明。

    代码如下:

     1 #include<bits/stdc++.h>
     2 typedef unsigned int ui;
     3 typedef long long ll;
     4 typedef unsigned long long ull;
     5 #define pf printf
     6 #define mem(a,b) memset(a,b,sizeof(a))
     7 #define prime1 1e9+7
     8 #define prime2 1e9+9
     9 #define pi 3.14159265
    10 #define lson l,mid,rt<<1
    11 #define rson mid+1,r,rt<<1|1
    12 #define scand(x) scanf("%llf",&x) 
    13 #define f(i,a,b) for(int i=a;i<=b;i++)
    14 #define scan(a) scanf("%d",&a)
    15 #define mp(a,b) make_pair((a),(b))
    16 #define P pair<int,int>
    17 #define dbg(args) cout<<#args<<":"<<args<<endl;
    18 #define inf 0x3f3f3f3f
    19 const int maxn=2e6+10;
    20 int n,m,t;
    21 inline int read(){
    22     int ans=0,w=1;
    23     char ch=getchar();
    24     while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    25     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    26     return ans*w;
    27 }
    28 int f[maxn],rank[maxn];
    29 bool flag;
    30 void init()
    31 {
    32     f(i,1,2*n)f[i]=i,rank[i]=0;
    33     flag=false;
    34 }
    35 int find(int x)
    36 {
    37     if(x==f[x])return x;
    38     return f[x]=find(f[x]);
    39 }
    40 void Union(int x,int y)
    41 {
    42     int fx=find(x);
    43     int fy=find(y);
    44     if(fx==fy)return;
    45     if(rank[fx]<rank[fy])f[fx]=fy;
    46     else
    47     {
    48         f[fy]=fx;
    49         if(rank[fx]==rank[fy])rank[fx]++;
    50     }
    51 }
    52 bool same(int x,int y)
    53 {
    54     return find(x)==find(y);
    55 }
    56 int main()
    57 {
    58     //freopen("input.txt","r",stdin);
    59     //freopen("output.txt","w",stdout);
    60     std::ios::sync_with_stdio(false);
    61     t=read();
    62     int cnt=0;
    63     f(tt,1,t)
    64     {
    65         n=read(),m=read();
    66         init();
    67         int a,b;
    68         f(i,1,m)
    69         {
    70             a=read(),b=read();
    71             if(same(a,b)||same(a+n,b+n))flag=1; 
    72             else
    73             {
    74                 Union(a,b+n);
    75                 Union(a+n,b);//将(a,b)分为不同的集合之中 
    76             }
    77         }
    78         pf("Scenario #%d:
    ",tt);
    79         if(flag)pf("Suspicious bugs found!
    ");
    80         else pf("No suspicious bugs found!
    ");
    81         pf("
    ");
    82     }
    83  } 

     

  • 相关阅读:
    树形dp--P2014 [CTSC1997]选课
    背包变形--P1759 通天之潜水
    区间dp--P1880 [NOI1995]石子合并
    动态规划--P2758 编辑距离
    筛法--CF449C Jzzhu and Apples
    BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
    BZOJ3530: [Sdoi2014]数数(Trie图,数位Dp)
    BZOJ1444: [Jsoi2009]有趣的游戏(Trie图,矩乘)
    BZOJ1195: [HNOI2006]最短母串(Trie图,搜索)
    BZOJ3238: [Ahoi2013]差异(后缀数组)
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12565411.html
Copyright © 2011-2022 走看看