相亲数据匹配

相亲数据匹配

https://ac.nowcoder.com/acm/contest/87410/E

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;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务