POJ 1611 The Suspects (并查集)

 

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int vis_tuan[500+10];
int vis[30000+10];
int mat[30000+10][510];
int fa[30000+10];
int ans;
int n,m;
int find(int x)
{
    return fa[x]==x?x:find(fa[x]);
}

void bin(int x,int y)  //前小后大
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    {
       // printf("x %d fx %d y %d fy %d\n",x,fx,y,fy);
       // printf("%d %d\n",vis[fx],vis[fy]);

       if(fy==0)
       {
           vis[fy]+=vis[fx];
           fa[fx]=fa[fy];
       }
       else
       {
           vis[fx]+=vis[fy];
           fa[fy]=fa[fx];
       }
    }
}

int main()
{

    int i,j,k;
    while(scanf("%d%d",&n,&m),n+m)
    {
        ans=0;
        int ok=0;
        //memset(vis_tuan,0,sizeof(vis_tuan));
        memset(vis,0,sizeof(vis));

        for(i=0;i<=n;i++)
        {
            vis[i]=1;
            fa[i]=i;
        }

        for(i=0;i<m;i++)
        {
            scanf("%d",&mat[i][0]);
            int tlen=mat[i][0];
            for(j=1;j<=tlen;j++)
            {
                scanf("%d",&mat[i][j]);
                if(mat[i][j]==0) ok=1;
            }
            sort(mat[i]+1,mat[i]+tlen+1);

            for(j=2;j<=tlen;j++)
            {
                //printf("  %d ",mat[i][j]);
                bin(mat[i][1],mat[i][j]);
            }
            //printf("\n");
        }


        printf("%d\n",vis[0]);





        /*if(ok==1)
        {
           int ret=0;
        for(i=0;i<n;i++)
        {
            if(find(i)==0) ret++;
        }
        printf("%d\n",ret);
        }
        else
            printf("0\n");*/
    }
    return 0;
}

 

posted @ 2015-07-31 19:37  sola94  阅读(90)  评论(0编辑  收藏  举报