poj 1611

#include<iostream>
#include<fstream>

using namespace std;

int f[30001],rank[30001];

int n,m;

void init(){
    int i;
    for(i=0;i<=n;i++){
        f[i]=i;
        rank[i]=0;
    }
}

int father(int s){
    if(s!=f[s])
        f[s]=father(f[s]);
    return f[s];
}

void unionset(int s,int t){
    int i=father(s);
    int j=father(t);
    if(rank[i]<rank[j])
        f[i]=j;
    else
    {
        f[j]=i;
        if(rank[i]==rank[j])
            rank[i]++;
    }
}


void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t,w;
    while(cin>>n>>m)
    {
        if(n==0&&m==0) return;
        init();

        for(i=1;i<=m;i++)
        {
            cin>>s;
            cin>>k;
            for(j=1;j<s;j++)
            {
                cin>>t;
                if(father(k)!=father(t))
                {
                    unionset(k,t);
                }
                k=t;
            }
        }
        k=0;
        j=father(0);
        for(i=0;i<n;i++)
            if(father(i)==j)
                k++;
        cout<<k<<endl;
    }

   



}

int main(){
    read();
    return 0;
}

posted on 2011-06-02 10:36  宇宙吾心  阅读(189)  评论(0)    收藏  举报

导航