The Suspects POJ - 1611

题目链接:https://cn.vjudge.net/problem/POJ-1611

经典并查集,寻找跟序号为0的学生在一个集合的有多少人;

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
//#include<bits/stdc++.h>
using namespace std;
const int N = 3e4+10;
int stu[N],f[N],Rank[N],number[N];
int Find(int x){
    if(f[x]==-1)
        return x;
    while(f[x]!=-1)
        x=f[x];
    return x;
}
void Union(int x,int y){
    int x1=Find(x);
    int y1=Find(y);
    if(x1==y1)return ;
    if(x1!=y1){
        if(Rank[x1]<Rank[y1]) {
            f[x1]=y1;
            number[y1]+=number[x1];
        }
        else {
            f[y1]=x1;
            number[x1]+=number[y1];
            if(Rank[x1]==Rank[y1])
                Rank[x1]++;
        }
    }
}
int main()
{
    int n,m;
    while(cin>>n>>m){
        if(n==0&&m==0)break;
        //if(m==0)continue;
        int flag=-99;
        for(int i=0;i<=n;i++){
            stu[i]=0;
            Rank[i]=0;
            f[i]=-1;
            number[i]=1;
        }
        for(int i=1;i<=m;i++){
            int k,x,y;
            cin>>k;
            k--;
            cin>>x;
            for(int j=1;j<=k;j++){
                cin>>y;
                //if(x==0)flag=i;
//                if(stu[x])
//                    Union(i,Find(x));
                //stu[x]=1;
                Union(x,y);
            }
        }

        cout<<number[Find(0)]<<endl;

    }
    //cout << "Hello world!" << endl;
    return 0;
}
发布了97 篇原创文章 · 获赞 3 · 访问量 9443

猜你喜欢

转载自blog.csdn.net/foolishpichao/article/details/97800945