现在的位置: 首页 > 综合 > 正文

POJ 1611:The Suspects 并查集求解

2018年05月25日 ⁄ 综合 ⁄ 共 694字 ⁄ 字号 评论关闭

    题目URL:http://poj.org/problem?id=1611

    我是用的并查集求解,另外用了添加集合元素时用了路径压缩,这样查找集合代表元素是可以时间更快。

    这是我的AC代码,欢迎拍砖。

   

#include<iostream>
#include<stdio.h>
using namespace std;

const int Max = 30000 + 10;
int set[Max];
int size[Max];

int root(int i)
{
	while(set[i] != -1) i = set[i];
	return i;
}

void unionTree(int &r1, int &r2)
{
	if(r1 == r2) return ;
	if(size[r1] > size[r2])
	{
		set[r2] = r1;
		size[r1] += size[r2];
		r2 = r1;
	}
	else
	{
		set[r1] = r2;
		size[r2] += size[r1];
		r1 = r2;
	}
}

int main()
{
	int n, m, num, a, b, r1, r2;
	while(scanf("%d%d", &n, &m) && (n || m))
	{
		for(int i=0; i<n; i++) set[i] = -1, size[i] = 1;
		
		for(int i=0; i<m; i++)
		{
			scanf("%d", &num);
			scanf("%d", &a);
			r1 = root(a);
						
			for(int j=1; j<num; j++)
			{
				scanf("%d", &b);
				r2 = root(b);
				unionTree(r1, r2);
			}
		}
		
		printf("%d\n", size[root(0)]);
	}
	system("pause");
	return 0;
}



抱歉!评论已关闭.