题意:有一些简单化合物,每个化合物都由两种元素组成,每个元素用一个大写字母组成,你是一个装箱工人,从实验员那里按照顺序依次把一些简单化合物装到车上,但是这里存在一个安全隐患,如果车上存在k个简单化合物,正好包含k中元素,那么他们将组成一个易爆易燃的化合物,为了安全起见,每当你拿到一个化合物的时候,如果他和已装车的化合物形成易爆化合物,你就应当拒绝装车,否则就应该装车,编程输出有多少个没有装车的化合物。
简单分析一下,从第一个化合物开始,如果第二个化合物组成元素与之完全相同,那么是易爆物,不能装车,应当拒绝;否则装车,再看第三个化合物...列举所有情况发现其实就是简单的并查集。
代码如下:
#include <stdio.h> #include <iostream> using namespace std; const int MAXN = 100000 + 10; int p[MAXN]; int findset(int x){ return p[x] != x ? p[x] = findset(p[x]) : x; } int main(){ int x, y; while(scanf("%d", &x) != EOF){ int refusals = 0; for(int i=0; i<MAXN; i++) p[i] = i; while(x!=-1){ scanf("%d", &y); x = findset(x); y = findset(y); if(x==y) refusals++; else p[x] = y; scanf("%d", &x); } printf("%d\n", refusals); } }