导航

POJ 2524

Posted on 2015-04-08 16:55  tun~  阅读(109)  评论(0编辑  收藏  举报

并查集思想,初始化每个元素的根节点为本身。

求解目标是求解存在几个集合。解决方案:查看有多少个根节点,表现在记忆数组上就是有多少个元素的根是它本身。

#include<stdio.h>
#define M 50005
int ji[M];
int findme(int a)
{
   while(ji[a]!=a)
   {
       a=ji[a];
   }
   return a;
}
void link(int a,int b)
{
    int tmp;
    tmp=b;
    a=findme(a);
    b=findme(b);
    ji[b]=a;
    while(ji[tmp]!=tmp)
    {
        tmp=ji[tmp];
        ji[tmp]=a;
    }
}
int main()
{
    int m,a,b,n,i,rel,ca;
    ca=0;
    scanf("%d%d",&n,&m);
    while(n!=0)
    {
        ca++;
        for(i=1;i<=n;i++)
        {
            ji[i]=i;
        }
        rel=0;
        while(m--)
        {
            scanf("%d%d",&a,&b);
            link(a,b);
        }
        for(i=1;i<=n;i++)
        {
            rel+=(ji[i]==i);
        }
        printf("Case %d: %d\n",ca,rel);
        scanf("%d%d",&n,&m);
    }
    return 0;
}