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  } 

     

  • 相关阅读:
    从远程库克隆
    添加远程库
    远程仓库
    删除文件
    xml 解析的四种方式
    遍历Map
    Spring 和SpringMVC 的父子容器关系
    JDK各版本新特性!
    看啦这么就别人的博客 我也来写一篇! Object转换其他类型
    手机访问电脑搭建的服务器地址
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12565411.html
Copyright © 2011-2022 走看看