E相亲数据匹配

通过读题可知,本题就是求在同一个图内的两种点的数量。

如果查询的点的属性是0,那就是求同一张图内属性为1的点的数量。

做法有很多种,出题人的STD是并查集,因为并查集好写(好拉板子)。

并查集过程中记录同一张图内两种点的数量即可。

//
// Created by td1336065617 on 2024/7/31.
//
#include <bits/stdc++.h>
using namespace std;
int bcj[110000], bcjsum[110000][2], xingbie[110000];
int n, m;
int find_bcj(int fx) {
    return bcj[fx] == fx ? fx : bcj[fx] = find_bcj(bcj[fx]);
}
int main() {
   // freopen("01/10.in", " r ", stdin);
   // freopen("01/10.out", " w ", stdout);

    cin >> n >> m;
    if (n < 1 || n>100000) {
        return -1;
    }
    if (m < 1 || m>100000) {
        return -2;
    }
    for (int i = 1; i <= n; i++)
    {
        bcj[i] = i;
        int xb;
        cin >> xb;
        if (xb < 0 || xb>1) {
            return -3;
        }
        xingbie[i]=xb;
        bcjsum[i][xb]++;
    }
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        if (x < 1 || x>n) {
            return -4;
        }
        if (y < 1 || y>n) {
            return -5;
        }
        if (x==y) {
            return -6;
        }
        int fx = find_bcj(x), fy = find_bcj(y);
        if (fx != fy) {
            bcj[fy] = fx;
            bcjsum[fx][1] += bcjsum[fy][1];
            bcjsum[fx][0] += bcjsum[fy][0];
        }
    }
    for (int i = 1; i <= n; i++)
    {
        cout << bcjsum[find_bcj(i)][!xingbie[i]] << endl;
    }
    return 0;
}