寒假训练POJ - 1611题解

问题链接:POJ - 1611

思路

并查集。按照输入给出的条件建立起集合,然后将0所在的元素个数输出出来。

AC的代码

#include<iostream>
#include<vector>
using namespace std;
int find(int );
void built(int , int );
int a[30000];
int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		if (n == 0 && m == 0) break;
		int s = 0, q;
		for (int i = 0; i < n; i++)
			a[i] = i;
		for (int i = 0; i < m; i++)
		{
			int k; vector<int> b;
			cin >> k;
			for (int j = 0; j < k; j++)
			{
				int b1;
				cin >> b1;
				b.push_back(b1);
			}
			for (int j = 0; j < k - 1; j++)
				built(b[j], b[j + 1]);
		}
		for (int i = 0; i < n; i++)
			if (find(a[i]) == find(a[0])) s++;
		cout << s << endl;
	}
	return 0;
}
int find(int x)
{
	if (a[x] == x) return x;
	else return find(a[x]);
}
void built(int x,int y)
{
	a[find(y)] = find(a[x]);
}

猜你喜欢

转载自blog.csdn.net/weixin_43970556/article/details/86675965