题意:题目实质要我们求的是使集合连成环的所有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 }