题目大意:
给出一些化合物,每组化合物由两个元素组成,在N>2的情况下,如果有n组化合物正好对应n种物质,如:A - B B - C C - A 这样就会产生爆炸,就不饿能要了,对于每组化合物,如果会产生爆炸则不能要,否则必须要。
解题思路:
经典带环并查集。看了一晚上硬是没看出来,题解把每一组化合物看成一个边,把每一个元素看成点,进来一组就连一组,如果成环的话则ans++,最后输出ans即可。AC代码:
PS:多组输入是个坑,注意一下
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int _max = 1e5+50;
int f[_max],ans=0,a,b;
int find(int x)//寻根+路径压缩
{
return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y)//判断是否合并
{
int t1=find(x);
int t2=find(y);
t1==t2?ans++:f[t2]=t1;
}
void init()
{
ans=0;
for(int i=0;i<_max;i++)
f[i]=i;
}
int main()
{
for(int i=0;i<_max;i++)
f[i]=i;
while(cin>>a)
{
if(a==-1)
{
cout<<ans<<endl;
init();
continue;
}
cin>>b;
merge(a,b);
}
//system("pause");
return 0;
}