uva 10608(并查集)

来源:互联网 发布:c语言swap是什么意思 编辑:程序博客网 时间:2024/04/30 00:06

题意:有n个人,m对基友,规定如果a和b是基友,且b和c是基友,那么a和c是基友,问最多有多少个人互相是基友。

题解:并查集,只需要加一个数组保存每个人的基友数量,最后遍历出最大的。

#include <stdio.h>#include <string.h>const int N = 30005;int n, m, t, pa[N], s[N];int get_parent(int a) {return a == pa[a] ? a : pa[a] = get_parent(pa[a]);}void merge(int a, int b) {int px = get_parent(a);int py = get_parent(b);if (px != py) {pa[px] = pa[py];s[py] += s[px];}}int main() {scanf("%d", &t);while (t--) {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {pa[i] = i;s[i] = 1;}int a, b;for (int i = 0; i < m; i++) {scanf("%d%d", &a, &b);merge(a, b);}int res = -1;for (int i = 1; i <= N; i++)if (s[i] > res)res = s[i];printf("%d\n", res);}return 0;}


0 0