POJ 2524(并查集)

这道题多了一个检查是否包含所有元素

可以设一个cnt表示集合里的数量,再与外面比较

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;

#define sf scanf
#define pf printf
#define debug printf("!
")
#define blank printf("
")
#define mem(a,b) memset(a,b,sizeof(a))

const int MaxN = 50010;
const int INF = 1<<27;

int p[MaxN],a[MaxN];
bool vis[MaxN];

int m,n;

int find(int x){return p[x]==x?x:p[x]=find(p[x]);}

void Union(int x,int y)
{
          int rx = find(x);
          int ry = find(y);
          p[rx] = ry;
}

int main()
{
    int i,j,k,l,c=0;
    while(~sf("%d%d",&n,&m),n+m)
    {
        i = 0;
        c++;
        mem(p,0);
        mem(vis,false);
        for(i=1;i<=n;i++)
                              p[i] = i;
        while(m--)
        {
                  sf("%d%d",&k,&l);
                  Union(k,l);
        }
        int cnt = 0;
                    for(i = 1;i<=n;i++)
                    {
                              if(!vis[find(i)])
                              {
                                        vis[find(i)] = true;
                                        cnt++;
                              }
                    }
                    pf("Case %d: %d
",c,cnt);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/qlky/p/5154783.html