本题是标准的并查集了,最后利用这些集求有多少独立集。
所以这里也写个标准程序过了。
最后查找独立集合: 看有多少个节点的父母节点是自己的,那么就是独立集合了。自己做自己的父母当然最独立的了,没有任何依赖,呵呵。
#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;
}
POJ 2524 Ubiquitous Religions Union Find 并查集,布布扣,bubuko.com
POJ 2524 Ubiquitous Religions Union Find 并查集
原文地址:http://blog.csdn.net/kenden23/article/details/36020497