模板

并查集模板

#include<stdio.h>
#define maxn 100005                //定义maxn   
using namespace std;
int s[maxn];
int find(int x)
{
    if(s[x]==x)
    {
        return x;
    }
    else
    {
        return find(s[x]);             //找上一个,一直到一样,即源头 
    }
}
void Union(int x,int y)
{
    int x1,y1;
    x1=find(x);
    y1=find(y);
    if(x1!=y1)
    {
        s[y1]=x1;
    }
}
int main()
{
    int i,j,count,a,b;
    for(i=0;i<=maxn;i++)                       //用了maxn; 
    {
        s[i]=i;             //赋值 
    }
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        if(a==0&&b==0)                //跳出循环 
        {
            break;
        }
        if(find(a)==find(b))            //判断a,b是否联通 
        {
            printf("YES  *\n");
        }
        else
        {
            printf("NO\n");
            Union(a,b);               //联通a,b      把b给a(以a为源头) 
        //  printf("a=%d     b=%d\n",find(a),find(b));
            if(find(a)==find(b))
            {
                printf("YES  #\n");
            }
            else
            {
                printf("NO   !!!!!\n");       //都联通了,好像已经没用了。。。。。。 
            }
        }
    }
    count=0;
    for(j=0;j<maxn;j++)              //用了maxn; 
    {
        if(s[j]==j)
        {
            count++;
        }
    }
    printf("count=%d\n",count);            //输出还有多少团体,联通的算一个了 
    return 0;
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容