两种代码,感觉都挺好玩的,有兴趣的可以多看看
#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; }