zoukankan      html  css  js  c++  java
  • poj2492 带权并查集

    题意:研究一种生物,有n个生物个体,发现有一些之间进行了交配,给出了这些关系,问是否有同性恋的bug出现。

    用01表示某元素和其祖先元素的性别关系,0 为相同,1 为不同,用 mod2 实现累计处理,这样就能直接用并查集做了。

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 int fa[2005],n,m,num[2005];
     5 
     6 void init(){
     7     for(int i=1;i<=n;i++)fa[i]=i;
     8     memset(num,0,sizeof(num));
     9 }
    10 
    11 int find(int x){
    12     int r=x,t1,t2,c=0;
    13     while(r!=fa[r]){
    14         c+=num[r];
    15         r=fa[r];
    16     }
    17     while(x!=r){
    18         t1=fa[x];
    19         t2=c-num[x];
    20         fa[x]=r;
    21         num[x]=c%2;
    22         x=t1;
    23         c=t2;
    24     }
    25     return r;
    26 }
    27 
    28 int main(){
    29     int t;
    30     scanf("%d",&t);
    31         for(int q=1;q<=t;q++){
    32             scanf("%d%d",&n,&m);
    33             init();
    34             int i;
    35             bool f=1;
    36             for(i=1;i<=m;i++){
    37                 int a,b;
    38                 scanf("%d%d",&a,&b);
    39                 int x=find(a),y=find(b);
    40                 if(x!=y){
    41                     num[x]=((num[b]+1-num[a])%2+2)%2;
    42                     fa[x]=y;
    43                 }
    44                 else{
    45                     if(num[a]==num[b])f=0;
    46                 }
    47             }
    48             printf("Scenario #%d:
    ",q);
    49             if(!f)printf("Suspicious bugs found!
    ");
    50             else printf("No suspicious bugs found!
    ");
    51             printf("
    ");
    52         }
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    深入理解多态..............................
    走过路过 不要错过..
    进军C#..
    员工打卡....
    MySQL
    MySQL
    MySQL
    MySQL
    MySQL
    MySQL
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4790247.html
Copyright © 2011-2022 走看看