首页 > 代码库 > UnionFind1703

UnionFind1703

 

题目大意:警察抓获N个罪犯,这些罪犯只可能属于两个团伙中的一个,现在给出M个条件(D a b表示a和b不在同一团伙),对于每一个询问(A a b)确定a,b是不是属于同一团伙或者不能确定。

又自己AC了 哈哈 只要食物链的那题完全弄懂,这种题目简直小CASE
这种类型的题目在于只建立一个并查集,一个集合里面各个类型的元素通过r[]来表示
#include<cstdio>
#include<cstring>

int r[100001],f[100001];

int find(int x)
{
int t;
if(x!=f[x])
{
t=f[x];
f[x]=find(t);
r[x]=(r[x]+r[t])%2;
}

return f[x];
}

void unit(int x,int y,int fx,int fy)
{
f[fx]=fy;
r[fx]=(r[y]+3-r[x])%2;
}

int main()
{
int j,i,N,M,x,y,casenum;
char ch;
int fx,fy;
scanf("%d",&casenum);
for(j=1;j<=casenum;j++)
{
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
{
r[i]=0;
f[i]=i;
}
for(i=1;i<=M;i++)
{
getchar();
scanf("%c %d %d",&ch,&x,&y);
fx=find(x);
fy=find(y);
if(ch==‘D‘)
unit(x,y,fx,fy);
else if(ch==‘A‘)
{
if(fx!=fy)
printf("Not sure yet.\n");
else if(r[x]==r[y])
printf("In the same gang.\n");
else printf("In different gangs.\n");
}
}
}
return 1;
}

UnionFind1703