poj 1703 Find them, Catch them

我参照了下边这篇博客:

http://www.voidcn.com/blog/u011008379/article/p-5747778.html

这道题就需要虚点的存在。

比如:输入D 1 2

那么就为2创造一个虚点2',让2‘和1同在一个集合。为1创造一个虚点1’和2同在一个集合。

判断a和b的时候,若a,b同在一个集合,那么a,b在同一个帮派。若a和b‘在一个集合,则a,b在不同的帮派里。

#include <stdio.h>
#define N 100000
int ax[N*2+5];
int nfind(int x);
void get_in(int a,int b);
bool nsame(int a,int b);
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n, m;
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n * 2; i++)
		{
			ax[i] = i;
		}
		while (m--)
		{
			char p[2];
			int s, q;
			scanf("%s%d%d", p, &s, &q);
			if (p[0] == 'D')
			{
				get_in(s, q + n);
				get_in(s + n, q);
			}
			else
			{
				if (nsame(s, q))
				{
					printf("In the same gang.\n");
				}
				else if (nsame(s, q + n))
				{
					printf("In different gangs.\n");
				}
				else
				{
					printf("Not sure yet.\n");
				}
			}
		}
	}
}
int nfind(int x)
{
	if (x != ax[x])
		ax[x] = nfind(ax[x]);
	return ax[x];
}
void get_in(int a, int b)
{
	int sa = nfind(a);
	int sb = nfind(b);
	if (sa != sb)
		ax[sa] = sb;
}
bool nsame(int a, int b)
{
	int sa = nfind(a);
	int sb = nfind(b);
	if (sa == sb)
		return true;
	else
		return false;
}


你可能感兴趣的:(poj,并查集)