Thursday, November 1, 2012

Finding The Largest Group Size By Disjoint Set

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define siz 1000005
int node,edge;
int rank[siz],p[siz];

void Make_set(int n){
    p[n]=n;
    rank[n]=0;
}

int Find_set(int x){
    if(x!=p[x]) p[x]=Find_set(p[x]);
    return p[x];
}

void Union(int x, int y){
    if(rank[x]<rank[y]){
        p[x]=y;
        rank[y]+=rank[x];
    }
    else{
        p[y]=x;
        rank[x]+=rank[y];
    }
}

int main()
{
    int u,v,x,y;
    //freopen("input.txt","r",stdin);
    while(scanf("%d%d",&node,&edge)==2){
        if(node==0&&edge==0) break;

        for(int i=0;i<=node;i++)
            Make_set(i);

        for(int i=0;i<edge;i++){
            scanf("%d%d",&u,&v);

            if(rank[u]==0) rank[u]=1;
            if(rank[v]==0) rank[v]=1;

            if(Find_set(u)!=Find_set(v))
                Union(Find_set(u),Find_set(v));
        }

        int mx=0;
        for(int i=1;i<=node;i++){
            mx=max(mx,rank[i]);
        }

        printf("%d\n",mx);

    }
    return 0;
}

No comments:

Post a Comment