zoukankan      html  css  js  c++  java
  • Live Archive 3644 XPlosives 解题报告

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=19&page=show_problem&problem=1645

    题意:题目实质要我们求的是使集合连成环的所有pairs数。可以把每个元素看成顶点,则构成一个简单化合物就在两个元素间连成一条边。当整个图存在环的时候,组成环的边对应的化合物是危险的,反之就是安全的。

          这样,我们可以用一个并查集来维护图的连通分量集合,每次得到一个简单化合物(x, y)时就检查x和y是否在同一集合中。如果是,则拒绝,否则就接受。另外,要注意一下输入输出的问题。

      

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <iostream>
     4 using namespace std;
     5 
     6 const int maxn = 1e5 + 5;
     7 int p[maxn];
     8 
     9 int find(int x)
    10 {
    11     while (x != p[x])
    12         x = p[x];
    13     return x;
    14 }
    15 
    16 int main()
    17 {
    18     int a, b, i, refusals;
    19     while (scanf("%d", &a) == 1)
    20     {
    21         for (i = 0; i < maxn; i++)
    22             p[i] = i;
    23         refusals = 0;
    24         while (a != -1)
    25         {
    26             scanf("%d", &b);
    27             int x = find(a);   // 找出x所在集合的代表
    28             int y = find(b);   // 找出y所在集合的代表
    29             if (x == y)       // 如果两个集合的代表是一样,即构成环的条件,则拒绝装入
    30                 refusals++;
    31             else
    32                 p[x] = y;   // 写成p[y] = x也可以
    33             scanf("%d", &a);
    34         }
    35         printf("%d\n", refusals);   // a = -1代表一个case的结束,输出统计的结果
    36 } 37 return 0; 38 }

        

  • 相关阅读:
    学习进度条
    学术诚信与职业道德
    czxt
    操作系统
    04 17评论博客
    0414 结对 2.0 33 34
    0408 汉堡包
    (补)结对心得
    构建之法4读后感
    复利计算4.0
  • 原文地址:https://www.cnblogs.com/windysai/p/3302551.html
Copyright © 2011-2022 走看看