题意:简单化合物是由两种元素组成,如果有k种化合物,并且恰好有k中元素就会爆炸,按输入顺序给出化合物,问有多少化合物不能放入。
如果两种元素已经在集合里,就不能放入。可以把每个元素看成顶点 一个化合物作为一条边 当整个图存在环的时候 组成环的边对应的化合物就是危险的 否则是安全的。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int pra[maxn],rank[maxn];
int find(int x)
{
if(pra[x]==x)return x;
return pra[x]=find(pra[x]);
}
void init()
{
for(int i=0;i<maxn;i++)
{
pra[i]=i;
rank[i]=0;
}
}
void unite(int x,int y)
{
if(rank[x]<rank[y])
pra[x]=y;
else
{
pra[y]=x;
if(rank[x]==rank[y])rank[x]++;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int a,b,ans=0;
init();
while(cin>>a)
{
if(a==-1){cout<<ans<<endl;ans=0;init();continue;}
cin>>b;
int x=find(a),y=find(b);
if(x==y){ans++;continue;}
unite(x,y);
}
return 0;
}