题意:有n个人,只要消耗一个单位的能量即可完全领悟一门新的语言。如果知道了每个人会的语言,是否能让这群天才两两直接或者间接的交流呢?所谓间接得交流是指经过若干个人的翻译使两个人得到相互表达的信息。如果不能,至少需要多少能量才能实现。
题解:并查集水题,先把所有人会的语言和自己放到一个集合内,然后判断所有人是否在同一个集合,如果不在同一个答案就加一。
#include <stdio.h> #include <string.h> const int N = 300; int pa[N], n, m, k; int get_parent(int x) { return x == pa[x] ? x : pa[x] = get_parent(pa[x]); } bool merge(int x, int y) { int px = get_parent(x); int py = get_parent(y); if (px != py) { pa[py] = pa[px]; return false; } return true; } int main() { int t; scanf("%d", &t); while (t--) { for (int i = 1; i < N; i++) pa[i] = i; scanf("%d%d", &n, &m); int a, sum = 0; for (int i = 1; i <= n; i++) { scanf("%d", &k); sum += k; for (int j = 0; j < k; j++) { scanf("%d", &a); merge(a, i + 100); } } if (sum == 0) { printf("%d\n", n); continue; } int res = 0; for (int i = 1; i <= n; i++) if (!merge(101, 100 + i)) res++; printf("%d\n", res); } return 0; }
原文地址:http://blog.csdn.net/hyczms/article/details/45074633