Live Archive 3644 X-Plosives 解题报告

题目链接: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 }

 

    

posted @ 2013-09-05 09:26  windysai  阅读(244)  评论(0编辑  收藏  举报