并查集(kruskal的核心思想)模板

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int n,m,set[1000];

int find(int x)//查找根节点

{

    return set[x]==x?x:set[x]=find(set[x]);//递归

}

void Union(int x,int y)//合并不相等根节点的两个集合

{

    int a=find(x),b=find(y);

    if(a!=b)

       set[a]=b;

}

int main()

{

    int a,b,x,y,sum;

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

    {

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

        {

            set[i]=i;

        }

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

        {

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

             Union(a,b);

        }

        sum=-1;

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

        {

            if(set[i]==i)

            {

                sum++;

            }

        }

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

    }

    system("pause");

    return 0;

}

你可能感兴趣的:(并查集)