HDU 1232 畅通工程

http://acm.hdu.edu.cn/showproblem.php?pid=1232

第一次做并查集,有点小爽。。。

View Code
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int idx[2000];

int n,m;

int find(int x)

{

    //找x所在并查集的根节点 

    return idx[x]==x?x:idx[x]=find(idx[x]);

}

int add(int a,int b)

{

    //把b连到a上 

    return idx[b]=a;

}

int main()

{

    int a,b,i;

    int p,q; 

    int ans;

    while(scanf("%d",&n),n)

    {

        scanf("%d",&m);

        ans=n-1;

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

            idx[i]=i;

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

        {

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

            p=find(a);

            q=find(b);

            if(p!=q)

            {

                add(p,q);

                ans--;

            }

        }

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

    }

    return 0;

}

 

你可能感兴趣的:(HDU)