More is better(并查集)

 

#include<stdio.h>

#include<string.h>

const int MAXN=10000010;

int father[MAXN],hash[MAXN];



void Make_set()

{

    for(int i=0;i<MAXN;i++)

    {

        father[i]=i;

        //rank[i]=0;

    }

}



int Find(int x)

{

    int r=x;

    while(r!=father[r])

    {

        r=father[r];

    }

    if(r!=x) father[x]=r;

    return father[x];

}



void Union(int x,int y)

{

    if(x==y) return ;

   /* if(rank[x]>rank[y]) father[y]=x;

    else

    {

        if(rank[x]==rank[y])

        {

            rank[y]++;

        }

        father[x]=y;

    }*/

    father[x]=y;

}



int main()

{

    int T,i,n,a,b;

    while(scanf("%d",&n)!=EOF)

    {

        memset(hash,0,sizeof(hash));

        Make_set();

        for(i=0;i<n;i++)

        {

            scanf("%d%d",&a,&b);

            int x=Find(a);

            int y=Find(b);

            Union(x,y);

        }

        int mx=0;

        for(i=1;i<MAXN;i++)

        {

            hash[Find(father[i])]++;

        }

        for(i=1;i<MAXN;i++)

        {

            if(mx<hash[i]) mx=hash[i];

        }

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

    }

    return 0;

}
#include <iostream>

using namespace std;

const int maxn=10000010;

int    n;

struct NODE

{

    int root;

    int num;

}nod[maxn];



struct SEG

{

    int u, v;

}seg[100001];



int u, v;

int maxsum;



int getfather(int r)

{

    if(nod[r].root==-1)

    return r;

    int temp = nod[r].root;

    nod[r].root=getfather(temp);

    return nod[r].root;

}



void union_set(int r1, int r2)

{

    int root1=getfather(r1);

    int root2=getfather(r2);

    nod[root1].root=root2;

    nod[root2].num += nod[root1].num;

    if(nod[root2].num>maxsum)

    {

        maxsum=nod[root2].num;

    }

}

int main()

{

    while(scanf("%d",&n)!=EOF)

    {

        maxsum=1;

        for (int i=1; i<=n; i++)

        {

              scanf("%d %d",&seg[i].u, &seg[i].v);

              nod[ seg[i].u ].root = -1;

              nod[ seg[i].u ].num=1;

              nod[ seg[i].v ].root =-1;

              nod[ seg[i].v ].num = 1;

        }

        for (int i=1; i<=n; i++)

        {

            if(getfather(seg[i].u)!=getfather(seg[i].v))

            {

                union_set(seg[i].u, seg[i].v);

            }

        }

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

    }

    return 0;

}

你可能感兴趣的:(more)