Hud 1856 More is Better[并查集]

来源:互联网 发布:软件流程图实例 编辑:程序博客网 时间:2024/06/07 00:59
/*  Hud 1856 More is Better  并查集.  rank数组表示,该树或者该集合成员个数.  把元素少的并到元素多的集合里面.*/#include<cstdio>#define MAX 10000000int father[MAX+2],rank[MAX+2];void Init(){    for(int i=1;i<=MAX;i++)    {        father[i]=i;        rank[i]=1;    }}int Find_Father(int x){    if(father[x]!=x)    father[x]=Find_Father(father[x]);    return father[x];}void Union(int a,int b){    int x=Find_Father(a);    int y=Find_Father(b);    if(x==y) return;    if(rank[x]>rank[y])    {        father[y]=x;        rank[x]+=rank[y];    }    else    {        father[x]=y;        rank[y]+=rank[x];    }}int main(){    int n;    while(~scanf("%d",&n))    {        Init();        int a,b;        for(int i=1;i<=n;i++)        {            scanf("%d%d",&a,&b);            Union(a,b);        }        int max=0;        for(int i=1;i<=MAX;i++)        if(rank[i]>max) max=rank[Find_Father(i)];        printf("%d\n",max);    }}/*  小小模板.*/#define MAX ?int father[MAX],rank[MAX];void Init()//初始化.每个结点都是一个集合{    for(int i=1;i<=MAX;i++)    {        father[i]=i;        rank[i]=1;    }}int Find_Father(int x){//递归路径压缩    if(x==Find_Father(x))    father[x]=Find_Father(x);    return father[x];}void Union(int a,int b){    int x=Find_Father(a);    int y=Find_Father(b);    if(x==y) return;    if(rank[x]>rank[y])    {        father[y]=x;        rank[x]+=rank[y];    }    else    {        father[x]=y;        rank[y]+=rank[x];    }}

相当囧啊!!

写了个小小的模板竟然错了。该模板做废。

原创粉丝点击