- 题目大意
有若干个由两种元素组成的简单化合物,现在把它们装进车里,如果车上有恰好有k种简单化合物并且恰好有k种元素的话,那么就会引发爆炸,所以车上的化合物必须避免满足这个条件。
- 解题思路
如果元素表示点,那么化合物就表示边,要爆炸的条件就是形成环,即为k个点k条边,那么就肯定存在环。直接用并查集判断就好了。
- 代码
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 1e5 + 50;
int fa[MAX];
void init(int n)
{
for (int i = 0; i <= n; i++)
fa[i] = i;
}
int find(int x)
{
if (x == fa[x])
return x;
else
{
return fa[x] = find(fa[x]);
}
}
int main()
{
int x, y;
while (scanf("%d", &x) != EOF)
{
init(MAX);
int sum = 0;
while (x != -1)
{
scanf("%d", &y);
int fx = find(x), fy = find(y);
if (fx == fy)
sum++;
else
{
fa[fx] = fy;
}
scanf("%d", &x);
}
printf("%d\n", sum);
}
return 0;
}