并查集(带计数)-- 模板

题意:
在另一个宇宙,一个月有 N 天。多变的天气条件使得人们很恼火,终于,天气统计局产生了。它会对外发布 M 条信息,格式如下: X Y 表示第 X 天的天气和第 Y 天一样。

但民众并不满足于此,他们想知道有多少天的天气和第 X 天一样。 现在,作为一个聪明的程序员,你能帮他们解决这个问题吗?

题解:
给并查集加上计数功能

#include
using namespace std;
int set[1000000], num[1000000];

int findSet(int x) {
    if (x == set[x]) return x;
    else return set[x] = findSet(set[x]);
}

void unionSet(int x, int y) {
    int fx = findSet(x);
    int fy = findSet(y);
    if (fx != fy) {
        num[fy] += num[fx];
        set[fx] = fy;
    }
}

int main() {
    int n, m, q, x, y, id;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        set[i] = i;
        num[i] = 1;
    }
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &x, &y);
        unionSet(x, y);
    }
    scanf("%d", &q);
    while (q--) {
        scanf("%d", &id);
        printf("%d\n", num[findSet(id)]);
    }
    return 0;
}

你可能感兴趣的:(数据结构)