首页 > 代码库 > POJ 2524 Ubiquitous Religions Union Find 并查集

POJ 2524 Ubiquitous Religions Union Find 并查集

本题是标准的并查集了,最后利用这些集求有多少独立集。

所以这里也写个标准程序过了。

最后查找独立集合: 看有多少个节点的父母节点是自己的,那么就是独立集合了。自己做自己的父母当然最独立的了,没有任何依赖,呵呵。

#include <stdio.h>

const int MAX_N = 50001;
//const int MAX_M = MAX_N/2 * (MAX_N-1) + 1;
int N, M;

struct SubSet
{
	int p, r;
};
SubSet sub[MAX_N];

void initSub()
{
	for (int i = 1; i <= N; i++)
	{
		sub[i].p = i;
		sub[i].r = 0;
	}
}

int find(int i)
{
	if (sub[i].p != i) sub[i].p = find(sub[i].p);
	return sub[i].p;
}

void unionTwo(int x, int y)
{
	int xroot = find(x);
	int yroot = find(y);
	if (sub[xroot].r < sub[yroot].r) sub[xroot].p = yroot;
	else
	{
		if (sub[xroot].r == sub[yroot].r) sub[xroot].r++;
		sub[yroot].p = xroot;
	}
}

int main()
{
	int u, v, t = 1;
	while (scanf("%d %d", &N, &M) && N && M)
	{
		initSub();
		for (int i = 0; i < M; i++)
		{
			scanf("%d %d", &u, &v);
			unionTwo(u, v);
		}
		int cnt = 0;
		for (int i = 1; i <= N; i++)
		{
			if (sub[i].p == i) cnt++;
		}
		printf("Case %d: %d\n", t++, cnt);
	}
	return 0;
}