并查集uva1160

来源:互联网 发布:linux 创建文件夹 编辑:程序博客网 时间:2024/05/22 17:23

题意:简单化合物是由两种元素组成,如果有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;}



0 0