并查集入门

2019.3.1学习笔记

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 50005;
typedef long long ll;
int fa[maxn];
int find(int x)
{
    return x == fa[x] ? fa[x] : fa[x] = find(fa[x]);//寻找x的爸爸
}
void baba(int x, int y)//把x,y变成一个爸爸
{
    int fx = find(x), fy = find(y);
    fa[fx] = fy;
}
int main()
{
    int n, m;
    int l = 0;
    while (~scanf("%d%d", &n, &m))
    {
        l++;
        int p = 0;
        int z[maxn] = { 0 };
        if (n == 0 && m == 0) break;
        for (int i = 1; i <= n; i++)//初始化
        {
            fa[i] = i;
        }
        for (int j = 1; j <= m; j++)
        {
            int a, b;
            scanf("%d %d", &a, &b);
            baba(a, b);
        }
        for (int k = 1; k <= n; k++)//遍历爸爸
        {
            if (z[find(k)] == 0)
            {
                p++;
                z[find(k)] = 1;
            }
        }
        printf("Case %d: %d\n", l, p);
    }
    return 0;

    
}

 

posted @ 2019-03-01 10:09  Fzzf1  阅读(103)  评论(0编辑  收藏  举报