UVa 10158 并查集+位操作

来源:互联网 发布:高中背英语单词软件 编辑:程序博客网 时间:2024/06/04 01:36

两种代码,感觉都挺好玩的,有兴趣的可以多看看

#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn=1e4+5;int par[maxn],val[maxn],n;void init(){    for(int i=0;i<n;i++)    {        par[i]=i;        val[i]=0;    }}int find(int num,int &rel){    if(par[num]==num)    {        rel=0;        return num;    }    int relx,fa;    fa=find(par[num],relx);    val[num]=val[num]^relx;    par[num]=fa;    rel=val[num];    return fa;}void setfriends(int x,int y){    int rel,relx,rely,fa,fb;;    fa=find(x,relx);    fb=find(y,rely);    if((fa==fb)&&(relx^rely))    {        printf("-1\n");        return;    }    else if(fa!=fb)    {        par[fa]=fb;        val[fa]=relx^rely;    }}void setenemies(int x,int y){    int rel,relx,rely,fa,fb;    fa=find(x,relx);    fb=find(y,rely);    if((fa==fb)&&(relx^rely^1))    {        printf("-1\n");        return;    }    else if(fa!=fb)    {        par[fa]=fb;        val[fa]=relx^rely^1;    }}int main(){    scanf("%d",&n);    init();    int c,x,y;    while(scanf("%d%d%d",&c,&x,&y)!=EOF&&(c||x||y))    {        switch(c)        {            case 1:                setfriends(x,y);break;            case 2:                setenemies(x,y);break;            default:                int tp1,tp2;                if(find(x,tp1)!=find(y,tp2))                    printf("0\n");                else                    printf("%d\n",tp1^tp2^(c&1));        }    }    return 0;}
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn=2*1e4+5;int par[maxn],n;void init(){    for(int i=0;i<2*n;i++)        par[i]=-1;}int find(int num){    if(par[num]<0)        return num;    return par[num]=find(par[num]);}void setfriends(int x,int y){    int fa,fb;;    if(find(x)==find(y+n))    {        printf("-1\n");        return;    }    if(find(x)!=find(y))    {        par[find(x)]=find(y);        par[find(x+n)]=find(y+n);    }}void setenemies(int x,int y){    int fa,fb;;    if(find(x)==find(y))    {        printf("-1\n");        return;    }    if(find(x)!=find(y+n))    {        par[find(x)]=find(y+n);        par[find(x+n)]=find(y);    }}int main(){    scanf("%d",&n);    init();    int c,x,y;    while(scanf("%d%d%d",&c,&x,&y)!=EOF&&(c||x||y))    {        switch(c)        {            case 1:                setfriends(x,y);break;            case 2:                setenemies(x,y);break;            default:                if(find(x)!=find(y)&&find(x+n)!=find(y))                    printf("0\n");                else                    printf("%d\n",(find(x)!=find(y))^(c&1));        }    }    return 0;}


0 0
原创粉丝点击