题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213
有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数。
并查集的入门题,什么优化都无用到就可以直接过。实质上就是统计总共有多少个不相交的集合。比较可恶的是,题目中 There will be a blank line between two cases 是骗人的!!!
1 #include <iostream> 2 using namespace std; 3 4 const int maxn = 1000 + 5; 5 int p[maxn], rank[maxn]; 6 7 int find(int x) 8 { 9 while (x != p[x]) 10 x = p[x]; 11 return x; 12 } 13 14 void merge(int i, int j) 15 { 16 int x = find(i); 17 int y = find(j); 18 if (x > y) 19 p[y] = x; 20 else 21 p[x] = y; 22 } 23 24 int main() 25 { 26 int a, b, i, t, m, n, refusals; 27 while (scanf("%d", &t) != EOF) 28 { 29 while (t--) 30 { 31 scanf("%d%d", &n, &m); 32 for (i = 1; i <= n; i++) 33 p[i] = i; 34 for (i = 0; i < m; i++) 35 { 36 scanf("%d%d", &a, &b); 37 merge(a, b); 38 } 39 for (refusals = 0, i = 1; i <= n; i++) 40 if (p[i] == i) 41 refusals++; 42 printf("%d\n", refusals); 43 } 44 } 45 return 0; 46 }