题目大意:给定n个人,和m个关系,m个关系代表谁和谁认识之类的,求这样的关系中,朋友圈人数最多的人数。
解题思路:这题用并查集来判断这两个人是否属于同一个朋友圈,刚开始每个人自己形成一个朋友圈,所以朋友圈人数为1,然后每碰到一个关系就判断这两个人是否属于同一个朋友圈,如果不是,就把其中一个的f【t】(t为这个圈子的根)改为另一个朋友圈的根r,然后把以r为根的这个圈子的人数加上以t为根的圈子的朋友数。这样最后只要找f【i】 == i(这样的i是根)的这样的圈子的朋友数,找最大的。
代码:
#include <stdio.h> #include <string.h> const int N = 30005; int n, m , t, f[N], c[N]; void init () { for (int i = 0; i <= n; i++ ) { f[i] = i; c[i] = 1; } } int getfather (int x) { return f[x] = ( f[x] == x ) ? x : getfather (f[x]); } int main () { scanf ("%d", &t); while (t--) { scanf ("%d%d", &n, &m); int x, y; init(); for (int i = 0; i < m; i++) { scanf ("%d%d", &x, &y); int p = getfather(x); int q = getfather(y); if (p != q){ c[p] += c[q]; f[q] = p; } } int max = 0; for (int i = 1; i <= n; i++) if (i == f[i] && max < c[i]) max = c[i]; printf ("%d\n", max); } return 0; }
UVA - 10608-Friends(并查集),布布扣,bubuko.com
原文:http://blog.csdn.net/u012997373/article/details/23614825