并查集 POJ-1703 Find them, Catch them


传送门:vjudge 或者 原网址


本题与食物连相似  传送门


题目大意:警察抓捕罪犯,罪犯有两个帮派(龙帮和蛇帮。。。抓罪犯还要分帮派,难道是龙蛇混杂,龙帮不敢抓??), 让你写个程序分辨两个罪犯是不是属于一个帮派,

输入 A 时判断两个罪犯是不是同一个帮派,  输入D 时说明两个罪犯不是同一个帮派的。



AC 代码:

#include <iostream>
#include <cstdio>

using namespace std;

int par[200100];
int Rank[200100];

void init(int n)
{
	for(int i=0; i<n; i++)
	{
		par[i] = i;
		Rank[i] = 0;
	}
}

int find_par(int n)
{
	if(par[n] == n) return n;
	return par[n] = find_par( par[n] );
}

void unit_par(int a, int b)
{
	a = find_par(a);
	b = find_par(b);
	if(a == b) return;
	if(Rank[a] < Rank[b]) par[a] = b;
	else
	{
		par[b] = a;
		if(Rank[b] == Rank[a]) Rank[a]++;
	}
}

bool same(int a, int b)
{
	return find_par(a) == find_par(b);
}

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int n, m;
		char ch[10];
		int a, b;
		scanf("%d%d", &n, &m);
		init(n*2);
		for(int i=0; i<m; i++)
		{
			scanf("%s%d%d", ch, &a, &b);
			if(ch[0] == 'A')
			{
				if(same(a,b)) printf("In the same gang.\n");
				else if(same(a,b+n) || same(a+n,b)) printf("In different gangs.\n");
				else printf("Not sure yet.\n");

			}
			else
			{
				unit_par(a, b+n);
				unit_par(a+n, b);
			}
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值