首页 > 其他 > 详细

并查集模板

时间:2021-04-17 10:42:45      阅读:20      评论:0      收藏:0      [点我收藏+]

以下代码是输出有多少个集合。

模板题。

#include<iostream>
using namespace std;
int a[1007], ans;
int find(int x)            //找根
{
    int r = a[x];
    while (r != a[r]) {    //不断查找其父亲,当自己值等于其位置为对应集合树的根
        r = a[r];
    }
    return r;
}
void change(int x, int y)//合并两个集合
{
    int fx = find(x);
    int fy = find(y);
    if (fx != fy) {        //当x,y的根不同时,证明是两个集合,于是连接两个集合(将x接到根y之下)
        a[fx] = fy;
    }
}
int main()
{
    int M, N, b, c;
    while (scanf("%d", &N),N) {
        ans = 0;
        scanf("%d", &M);
        for (int i = 1;i <= N;i++)//初始化
            a[i] = i;
        for (int i = 0;i < M;i++) {
            scanf("%d%d", &b, &c);
            change(b, c);            //尝试将b,c所属集合连接
        }
        for (int i = 1;i <= N;i++)
            if (i == a[i])            //寻找根,找到就认为找到了一个集合
                ans++;
        printf("%d\n", ans);
    }
}

 

并查集模板

原文:https://www.cnblogs.com/20km-shimakaze/p/14669290.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!