并查集+思维——X-Plosives

Posted lfri

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集+思维——X-Plosives相关的知识,希望对你有一定的参考价值。

一、问题描述(题目链接

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

二、问题分析

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

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

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

三、代码实现

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 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
", ans);
53     }
54     return 0;
55 }

 

以上是关于并查集+思维——X-Plosives的主要内容,如果未能解决你的问题,请参考以下文章

UVA 1160 - X-Plosives

2021年河南省赛——I.七便士(思维+并查集)

[2016-03-19][UVALive][3644][X-Plosives]

Codeforces 1263D. Secret Passwords(并查集,思维)

hdu6074[并查集+LCA+思维] 2017多校4

3/29 思维+并查集+最短路