并查集+思维——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的主要内容,如果未能解决你的问题,请参考以下文章
[2016-03-19][UVALive][3644][X-Plosives]