并查集模板

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

模板题。

#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);
   a[x]=fx;
   a[y]=fy;         //路径压缩,直接把父亲给儿子
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); } }

 

posted @ 2021-04-17 00:49  20kmのshimakaze  阅读(61)  评论(0)    收藏  举报