#Description
每次给你两个数 a b
表示两种元素构成的一个化合物
然后把这个化合物装到车子里面去
如果一旦出现任意k中化合物恰好由K个元素构成,就爆炸了,
比如说现在车子里有AB BC 再来个CA 就爆炸了,所以CA不能装
不能装进去
问你有多少个不能装的
#Algorithm
并查集
如果是树,就是安全的,一旦有环就不安全了
所以每次来两个,如果相连,就不安全,否则就是安全的
#Code
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 100000 + 9;
int id[MAXN], sz[MAXN];
int ans;
void init()
{
for (int i = 0; i < MAXN; i++) {
id[i] = i;
sz[i] = 1;
}
}
int find(int p)
{
if (p != id[p]) {
id[p] = find(id[p]);
}
return id[p];
}
void unite(int p, int q)
{
int i = find(p);
int j = find(q);
if (i == j) {
ans++;
return;
}
if (sz[i] > sz[j]) {
id[j] = i;
sz[i] += sz[j];
} else
{
id[i] = j;
sz[j] += sz[i];
}
}
int main()
{
//freopen("in.txt", "r", stdin);
init();
int a, b;
for(;;)
{
if (scanf("%d", &a) == EOF) break;
if (a == -1) {
printf("%d\n", ans);
init();
ans = 0;
continue;
}
scanf("%d", &b);
unite(a, b);
}
}