POJ1611 The Suspects: 并查集入门

#include<iostream>
using namespace std;
#define Size 30000
int Pre[Size+1], Sum[Size+1];// Sum[i] 表示 第i组 的人数

int Get_Pre( int a )
{
        if( Pre[a]!=a )
            a = Get_Pre( Pre[a] );// 路径压缩
        return a;
}

void Union( int a, int b )
{
        int P1 = Get_Pre(a);
        int P2 = Get_Pre(b);
        if( P1 == P2 )
            return ;
        Pre[P2] = P1;
        Sum[P1] += Sum[P2];
}

int main()
{
        int n, m;
        while( cin>>n>>m && n!=0 )
        {
                for( int i=0; i<n; i++ )
                {
                        Pre[i] = i;     Sum[i]=1;
                }
                int k, N1, N2;
                for( int i=0; i<m; i++ )
                {
                        cin>>k;
                        cin>>N1;
                        for( int j= 1; j<k; j++ ){
                                cin>>N2;
                                Union( N1, N2 );
                        }
                }
                cout<<Sum[Get_Pre(0)]<<endl;
        }
        return 0;
}

 

你可能感兴趣的:(poj)