【POJ 1611】【并查集】The Suspects

 水水的并查集,上学期为什么我会半天A不了,好神奇的说;


#include "iostream"
using namespace std;
#define Max 300010
int f[Max],num[Max];//num是关键。
void init();
int find(int x);
void join(int x,int y);
int main(int argc, char const *argv[])
{
    int n,m,a,father,son;
    while(~scanf("%d %d",&n,&m) && (n+m))
    {

        init();
        for (int i = 0; i < m; ++i)
        {
            scanf("%d",&a);
            scanf("%d",&father);
            for (int j = 1; j < a; ++j)
            {
                scanf("%d",&son);
                join(father,son);
            }
        }
        printf("%d\n",num[find(0)]);//找到0所在的集合
    }
    return 0;
}
void init()
{
    for (int i = 0; i < n; ++i)
    {
        f[i]=i;
        num[i]=1;
    }
}
int find(int x)
{
    if(x==f[x])
        return x;
    return f[x]=find(f[x]);
}
void join(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x!=y)
    {
        f[y]=x;
        num[x]+=num[y];
    }
}


你可能感兴趣的:(C++,并查集)