使用father数组,为根时存放权值的相反数(为了区分成员的根),不为根时存放father,f区分根和非根:father为正或者为负
-
makeset:获得n颗树,权值
-
find:寻找成员根结点,如果该成员不是根(避免误伤权值)就并将成员链接到根节点上
-
union:比较权值,将权值小的链接到权值大的上面去,维护权值
下面用一道例题来展现并查集的makeset,find,union和寻找两个元素是否在同一个等价类中的基本实现
有n台计算机,编号为1到n。设定如果计算机a和计算机b可以通信,则计算机b和计算机a亦可以通信;如果计算机a和计算机b可以相互通信,计算机b和计算机c可以相互通信,则计算机a和计算机c亦可以相互通信。现给定某些计算机的可通信情况,请编写程序判断任意两台计算机是否可以通信。
#include<stdio.h>
int father[1000]; //存放所有人信息的并查集
int unioned(int m;)
{
int i;
int mem1,mem2;
for(i=0;i<m;i++) //按秩union
{
scanf("%d%d",&mem1,&mem2);
father1=find(mem1);
father2=find(mem2);
if(father[father1]<=father[father2])//父亲结点存放子树的秩的相反数来区分正数的成员