省赛训练之并查集(五)

  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();		
		}
	}
}

 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值