POJ-->1703:Find them, Catch them
题目解释:有两个犯罪团伙,n个犯罪团伙人数,m组数据。通过并查集的方法做这道题。
方法:
#include<cstdio>
#include<cstring>
const int maxn = 100000+5;
int n,m;
int set[maxn+maxn];
int set_find(int d){
if(set[d]<0)
return d;
return set[d] = set_find(set[d]);
}//递归计算set_find的值。
int main(){
int loop;
scanf("%d",&loop);
while(loop--){
scanf("%d%d",&n,&m);
memset(set,-1,sizeof(set));
for(int i = 0;i<m;i++){
int a,b;
char s[5];
scanf("%s%d%d",s,&a,&b);
if(s[0]=='A'){
if(set_find(a)!=set_find(b)&&set_find(a)!=set_find(b+n))//如果a不和b同一组,也不和b另外的那一个同一组
printf("%s\n","Not sure yet.");
else if(set_find(a)==set_find(b))//a和b同一组
printf("%s\n","In the same gang.");
else //a和b另外的那个同一组
printf("%s\n","In different gangs.");
}
else{
if(set_find(a)!=set_find(b+n)){//如果a和b的另外一个不同一组
set[set_find(a)]=set_find(b+n);
set[set_find(b)]=set_find(a+n);
}
}
}
}
return 0;
}
说真的,这个方法我一直想不通,明天再问一问老师吧。
下面是我自己想的方法,提交一直是WA,不知道为什么,请懂的同学帮我看下吧~谢啦~:
/*
思路:有两个帮派,所以将两个帮派加起来等于5,初始化值为-1,令一个帮派为2,
则另外一个帮派就为1,如果D a b,则令它们的和为5。通过比较它们的值求出是否是同一帮派
*/
#include<stdio.h>
#include<string.h>
int a[330000];
int main(){
int n,m,i,j,T,p,q;
char ch;
scanf("%d",&T);
while(T--){
memset(a,-1,sizeof(a));
scanf("%d%d",&n,&m);
getchar();
// if()
for(i=0;i<m;i++){
scanf("%c%d%d",&ch,&p,&q);
// if(m==1){
// printf("In different gangs.\n");
// break;
// }
if(ch=='A'){
// if()
// printf("a[p]=%d a[q]=%d\n",a[p],a[q]);
if(p==q)
printf("In the same gang.\n");
else if(a[p]==-1||a[q]==-1)
printf("Not sure yet.\n");
else if(a[p]==a[q]&&a[p]>0&&a[q]>0)
printf("In the same gang.\n");
else printf("In different gangs.\n");
}
if(ch=='D'){
if(a[p]==-1&&a[q]==-1){
a[p] = 2;
a[q] = 3;
}
else if(a[p]>0&&a[q]<0)
{
a[q]=5-a[p];
}
else {
a[p] = 5-a[q];
}
}
getchar();
}
}
}