朋友圈
现在有 105 个用户,编号为 1- 105,现在已知有 m 对关系,每一对关系给你两个数 x 和 y ,代表编号为 x 的用户和编号为 y 的用户是在一个圈子中,例如: A 和 B 在一个圈子中, B 和 C 在一个圈子中,那么 A , B , C 就在一个圈子中。现在想知道最多的一个圈子内有多少个用户。
数据范围: 1≤≤2×10^6 1≤m≤2×10^6
输入:
第一行输入一个整数T,接下来有T组测试数据。
对于每一组测试数据:第一行输入1个整数n,代表有n对关系。
接下来n行,每一行输入两个数x和y,代表编号为x和编号为y的用户在同一个圈子里。
输出:
对于每组数据,输出一个答案代表一个圈子内的最多人数
思路,判断是不是在一个圈子里,就是判断是不是在一个集合里,用并查集真好。我们还要更新自己圈子里元素的个数。
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <map>
using namespace std;
int p[100010]; // 指出他的根
int cnt[100010]; // 用来统计个数
// find函数
int f(int x) {
if (p[x] != x) {
p[x] = f(p[x]); // 路径压缩
} else {
return p[x];
}
return p[x];
}
int main() {
int t;
cin >> t;
while (t) {
for (int i = 0; i < 100010; i++) {
p[i] = i;
cnt[i] = 1;
}
int n;
cin >> n;
int res = 0;
while (n--) {
int a, b;
cin >> a >> b;
int x = f(a);
int y = f(b);
if(x != y) {
p[x] = y;
cnt[y] += cnt[x];
res = max(cnt[y], res);
}
}
printf("%d\n", res);
t--;
}
}
标签:cnt,int,res,圈子,查集,算法,朋友圈,编号,include
From: https://www.cnblogs.com/yumingkuan/p/17294359.html