并查集+思维——X-Plosives

一、问题描述(题目链接)

有n种化合物,每种化合物由两种元素组成。当几种的化合物数量等于他们所含不同元素的数量时,就会发生爆炸。现在依次给出化合物的组成,当新的化合物与之前的化合物放在一起会发生爆炸时,就不能允许这个化合物放进来。输出拒绝的次数。

二、问题分析

把元素看成点,化合物看成边,每次新的化合物进来当成连一条边。

如果图中没有环,则每个连通分量是一棵树,其边数等于点数减1,不可能存在爆炸的情况;如果图中有环,则这个环上点数等于边数,就会爆炸。

使用并查集连边,如果要连的两个点在同一集合中,则答案加1。

三、代码实现

 1 #include
 2 #include
 3 #include
 4 #include
 5 using namespace std;
 6 
 7 typedef long long LL;
 8 const int maxn = 100000 + 10;
 9 int par[maxn];
10 int n, ans;
11 
12 void init()
13 {
14     for (int i = 0; i < maxn; i++)
15         par[i] = i;
16 }
17 
18 int find_set(int x)
19 {
20     if (x != par[x])
21         par[x] = find_set(par[x]);
22     return par[x];
23 }
24 
25 void unite(int x, int y)
26 {
27     int rootx = find_set(x);
28     int rooty = find_set(y);
29 
30     if (rootx == rooty)            //如果两个元素在同一集合,则会爆炸;此时应拒绝加入,答案加一
31     {
32         ans++;
33         return;
34     }
35 
36     par[rootx] = rooty;
37 }
38 
39 int main()
40 {
41     int x,y;
42     while (scanf("%d",&x) == 1)
43     {
44         ans = 0;
45         init();
46         while (x != -1)
47         {
48             scanf("%d", &y);
49             unite(x, y);
50             scanf("%d", &x);
51         }
52         printf("%d\n", ans);
53     }
54     return 0;
55 }

 

转载于:https://www.cnblogs.com/lfri/p/9484600.html

你可能感兴趣的:(并查集+思维——X-Plosives)