POJ 1703 Find them, Catch them

haha,今天在做这道题目得时候看到一个搞笑的题解,haha,给大家看看。

题意 : 就是一个城市有两个帮会,如果不是A帮会就定是B帮会,但是一开始不清楚哪些是自己人...

/*
这道题告诉我们,有什么事找老大说去。。。
还有,我是卖切糕的。。
*/

# include<cstdio>
# include<cstring>
using namespace std;

# define N 100005

int father[N],Rank[N],opp[N];   //opp表示它的敌对势力  =。=

void make_set(int n)
{
	int i;
	for(i=1;i<=n;i++)
	{
		father[i]=i;
		opp[i]=Rank[i]=0;    //刚出道,没有敌对势力
	}
	
}

int find(int r)            //小弟全部得跟老大姓
{
	if(father[r]!=r)
		father[r]=find(father[r]);
	return father[r];
}

void merge(int a,int b)   //a,b成一家
{
	a=find(a);
	b=find(b);
	if(a==b)
		return;
	if(Rank[a]>Rank[b])
		father[b]=a;
	else
	{
		father[a]=b;
		if(Rank[a]=Rank[b])
			Rank[b]++;
	}
}

int main()
{
	int i,n,m,a,b,t,head_a,head_b;
	char op[10];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		make_set(n);
		for(i=1;i<=m;i++)
		{
			scanf("%s%d%d",op,&a,&b);
			head_a=find(a); //找出他们各自的老大
			head_b=find(b);  

			if(op[0]=='A')
			{
				if(head_a==head_b)        //同一个势力,兄弟见面了
					printf("In the same gang.\n");   //哥俩好呀!					
				else if(head_a==find(opp[head_b]))    //什么,你不认识我? |-- 没关系,我认识你们一个人的老大就是他(我情敌的老大就是你,所以你就是我敌人)
					printf("In different gangs.\n");    //去你丫的!!!
			    else                                
					printf("Not sure yet.\n");  //大哥,我什么都不知道啊
			}
			else
			{	
				if(opp[a]==0)            //没有敌对势力,毕竟刚出道嘛
					opp[a]=head_b;       //他的敌对势力就是b所在的势力
				if(opp[b]==0)            //纯洁的孩子啊
					opp[b]=head_a;       //就看你不爽,咋地~~~~
				merge(a,opp[head_b]);    //加到自己的势力去,投靠老大去了(自己的势力就是b敌对的势力)
				merge(b,opp[head_a]);    //大哥,我来了。。。。。			

			}	
		}
	}
	return 0;
}
代码来源 :    rdy2012  

转载于:https://www.cnblogs.com/cnwsycf/p/3335370.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值