題意:在這個城市裏有2個黑幫團伙,現在給出N個人,M條信息
輸入D x y代表x於y不在一個團伙裏
輸入A x y要輸出x與y是否在同一團伙或者不確定他們在同一個團伙裏
分析:雖說是並查集的題,但又有所不同,
本題給出的信息爲x,y不在一個團伙,而並查集確定的是關於有關係的操作
假設x與x+N不在一個團伙,y與y+N不在一個團伙,又x與y不在一個團伙,
一共只有2個黑幫團伙,所以x與y+N在一個團伙,y與x+N在一個團伙,
這樣就可以將無關係的信息,轉化爲有關係,再用並查集即可,
但是若x與y不在一個相同的團伙,得確定他們關係無法確定還是確定不在一個團伙
同理可以判斷x與y+N的關係和y與x+N的關係即可
#include<stdio.h>
#define M 200000
int f[M+5];
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
void mix(int a,int b)
{
a=find(a);
b=find(b);
if(a!=b)
f[a]=b;
}
int judge(int a,int b)
{
a=find(a);
b=find(b);
if(a!=b)
return 0;
return 1;
}
int main()
{
int T,n,m,i,a,b;
char c;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
getchar();
for(i=1;i<=n*2;i++)
f[i]=i;
for(i=1;i<=m;i++){
scanf("%c%d%d",&c,&a,&b);
getchar();
if(c=='D'){
mix(a,b+n); //a與b+n在一個團伙
mix(b,a+n); //b與a+n在一個團伙
}
else if(c=='A'){
if(judge(a,b))
printf("In the same gang.\n");
else if(judge(a,b+n)||judge(b,a+n)) //若不在同一團伙,得判斷是否無法確定關係
printf("In different gangs.\n");
else
printf("Not sure yet.\n");
}
}
}
return 0;
}
poj 2492 也是同樣的題型,直接改改輸入輸出就ok