zoukankan      html  css  js  c++  java
  • POJ 2492 (简单并查集) A Bug's Life

    题意:有编号为1~n的虫子,开始假设这种昆虫是异性恋。然后已知xi 和 yi进行交配,根据已知情况分析能否推理出其中是否有同性恋

    这道题和 POJ 1182 食物链 十分相似,不过在更新与父节点关系的时候要简单一些

    sex数组保存的是与父节点的性别关系,如果与父节点是同性,则为0,否则是1

    每次路径压缩的同时要更新sex[a] = (sex[a] + sex[temp]) % 2;

    还有就是如果x 和 y 不在一个集合,两棵树进行合并的时候,考虑x px y py 四者之间的关系,有

    parent[px] = py;
    sex[px] = 1 - (sex[x] ^ sex[y]);

    这个在纸上模拟一下就很容易得出来

    在敲代码的过程中还是犯了两个低级的小错误,因为一旦我们发现了存在同性恋,便可以输出结果了,不过要对剩余未读入的数据“忽略”

    因为i可能是break出来的,这次循环没有完成,i也没有自增,所以在“忽略”的循环里面,i首先要自增一下

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int maxn = 2000 + 10;
     8 int parent[maxn], sex[maxn];
     9 
    10 int GetParent(int a)
    11 {
    12     if(parent[a] == a)    return a;
    13     int temp = parent[a];
    14     parent[a] = GetParent(parent[a]);
    15     sex[a] = (sex[a] + sex[temp]) % 2;
    16     return parent[a];
    17 }
    18 
    19 int main(void)
    20 {
    21     #ifdef LOCAL
    22         freopen("2492in.txt", "r", stdin);
    23     #endif
    24 
    25     int T, kase;
    26     scanf("%d", &T);
    27     for(kase = 1; kase <= T; ++kase)
    28     {
    29         int n, m, i;
    30         int x, y;
    31         bool flag = false;
    32         scanf("%d%d", &n, &m);
    33         for(int i = 0; i <= n; ++i)
    34         {
    35             parent[i] = i;
    36             sex[i] = 0;
    37         }
    38         for(i = 0; i < m; ++i)
    39         {
    40             scanf("%d%d", &x, &y);
    41             int px = GetParent(x);
    42             int py = GetParent(y);
    43             if(px == py)
    44             {
    45                 if(sex[x] == sex[y])
    46                 {
    47                     flag = true;
    48                     break;
    49                 }
    50             }
    51             else
    52             {
    53                 parent[px] = py;
    54                 sex[px] = 1 - (sex[x] ^ sex[y]);
    55             }
    56         }
    57         for(++i; i < m; ++i)
    58             scanf("%d%d", &x, &y);
    59         printf("Scenario #%d:
    %suspicious bugs found!
    
    ", kase, flag ? "S" : "No s");
    60         //if(kase < T)    printf("
    ");
    61     }
    62     return 0;
    63 }
    代码君
  • 相关阅读:
    【GoLang】GoLang map 非线程安全 & 并发度写优化
    【IDEA】IDEA 如何设置编辑器字体大小
    【GoLang】GoLang fmt 占位符详解
    转头条:阿里p7架构师:三年经验应该具备什么样的技能?
    RPC与RMI的区别
    为什么使用消息队列,为什么使用RabbitMQ、springAMQP
    cookie的安全性问题
    solr与mysql数据同步的方案
    springcloud与dubbo对比:
    mybatis与分布式事务的面试
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3950103.html
Copyright © 2011-2022 走看看