算法题-朋友圈-并查集

朋友圈

现在有 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--;
    }
}
posted @ 2023-04-06 21:50  博客是个啥?  阅读(73)  评论(0编辑  收藏  举报