并查集

特点:

1,            都有一个数组保存它的根节点

2,            用vis数组保存其是否访问过

3,            如果cnt=1;说明该图是连通的。连通图中只有根节点的父节点是自身,cnt应该是1

解决的题目:

1,题目已经给了图上顶点之间的关系,通过顶点之间的关系,求连通分量的个数。

#include "stdio.h"

int bin[1002];

int ans=1;

int findx(int x)//找x的根结点

{

    intr=x;

   while(bin[r] !=r)

       r=bin[r];

   return r;

}

//通过两点间的关系,构造一棵有根数

void merge(int x,int y)//使x指向y,合并x,y

{

    intfx,fy;

    fx= findx(x);

    fy= findx(y);

   if(fx != fy)

       bin[fx] = fy;

       elseans=0;//ans=0;说明图存在回路。

}

int main()

{

    intn,m,i,x,y,count;

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

    {

       for(i=1;i<=n;i++)//初始化bin数组,每个结点分别属于不同集合

           bin[i] = i;

       for(scanf("%d",&m);m>0;m--)

       {

           scanf("%d %d",&x,&y);

           merge(x,y);//合并x,y;

       }

       for(count=-1, i=1;i<=n;i++)

           if(bin[i] == i)

                count++;

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

    }

}

 


2,可以求给定的图中顶点的关系中,所有顶点间是否存在回路问题。(如果两个顶点的根节点相同,则这两个顶点存在回路)

         1,判断有无回路

         2,判断是否连通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值