首页 > 编程语言 >算法学习--并查集相关知识及例题

算法学习--并查集相关知识及例题

时间:2023-07-26 12:32:56浏览次数:40  
标签:return -- 查集 father int maxN findFather 例题 节点

一、并查集的定义

算法学习--并查集相关知识及例题_i++

二、基本操作

1、初始化

一开始,每个元素都是独立的集合

#include<iostream>

using namespace  std;

const int maxN=1000;
int father[maxN];


int main()
{
    for(int i=1;i<=maxN;i++)
    {
        father[i]=i;
    }

    return 0;
}
2、查找

递推版本:

//返回元素x所在的根节点
int findFather(int x)
{
    while(x!=father[x])
    {
        x=father[x];
    }
    return x;
}

递归版本:

//返回元素x所在的根节点
int findFather(int x)
{
    if(x==father[x])return x;
    else return findFather(father[x]);
}
3、合并

算法学习--并查集相关知识及例题_ios_02

void Union(int a,int b)
{
    int fatherA= findFather(a);//找到根节点
    int fatherB= findFather(b);
    if(fatherA!=fatherB)//说明不是同一个集合
    {
        father[fatherA]=fatherB;
    }
}
4、记录树高防止退化

算法学习--并查集相关知识及例题_i++_03

三、路径压缩

算法学习--并查集相关知识及例题_i++_04

递推写法:

int findFather(int x)
{
   int a=x;
   while(x!=father[x])
   {
       x=father[x];//找到x是根节点
   }
   while(a!=father[a])
   {
       int z=a;
       a=father[a];
       father[z]=x;//对每一个结点,都把其父节点设为x
   }
   return x;
}

递归写法:

int findFather(int x)
{
    if(x==father[x])return x;
    else{
        int F= findFather(father[x]);
        father[x]=F;
        return F;
    }
}

四、例题

1、好朋友

算法学习--并查集相关知识及例题_递归_05

算法学习--并查集相关知识及例题_i++_06

#include<iostream>

using namespace  std;

const int maxN=110;
int father[maxN];
bool isRoot[maxN];
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        father[i]=i;
        isRoot[i]=false;
    }
}
int findFather(int x)
{
    int a=x;
    while(x!=father[x])
        x=father[x];
    while(a!=father[a])
    {
        int z=a;
        a=father[a];
        father[z]=x;
    }
    return x;
}
void Union(int a,int b)
{
    int fa= findFather(a);
    int fb= findFather(b);
    if(fa!=fb)
    {
        father[fa]=fb;
    }
}
int main()
{
   int n,m;
   while(scanf("%d%d",&n,&m)!=EOF)
   {
       init(n);
       int a,b;
       for(int i=0;i<m;i++)
       {
           scanf("%d%d",&a,&b);
           Union(a,b);
       }
       for(int i=1;i<=n;i++)
       {
           isRoot[findFather(i)]=true;
       }
       int ans=0;
       for(int i=1;i<=n;i++)
       {
           ans+=isRoot[i];
       }
       printf("%d\n",ans);
   }
    return 0;
}
4 2
1 4
2 3

2

7 5
1 2
2 3
3 1
1 4
5 6

3
2、食物链

算法学习--并查集相关知识及例题_递归_07

标签:return,--,查集,father,int,maxN,findFather,例题,节点
From: https://blog.51cto.com/u_16200950/6855273

相关文章

  • 基于Android的眼镜商场app-计算机毕业设计源码+LW文档
    前端用户功能:(1)app首页:显示app所有商品的相关信息,供用户搜索、浏览查看,包括商品展示、商品类别及搜索等信息的展示。(2)注册登录:实现用户注册,登录系统实现,注册成功之后默认为登录状态。(3)商品展示:商家可以制作漂亮的眼镜产品图片,并在商场展示。用户可以通过查看图片细节来......
  • Oracle数据完整性和锁机制
    Oracle数据完整性和锁机制本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但是与数据库程序开发和管理、优化密切相关;另外本课的部分内容在前面章节已经涉及,请注意理论联系实际。事务  事务(Transaction)从通讯的角度看:是用户定义的数据库操作序列,这些操作要么全做、要么......
  • ORACLE函数大全
    ORACLE函数大全SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制数;SQL>selectascii('A')A,ascii('a')a,ascii('0')zero,ascii('')spacefromdual;      A        A     ZERO    SPACE------------------------------------......
  • iOS消息推送机制的实现
    iOS消息推送的工作机制可以简单的用下图来概括:Provider是指某个iPhone软件的Push服务器,APNS是ApplePushNotificationService的缩写,是苹果的服务器。上图可以分为三个阶段:第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 第三阶段:iPhone把发来的消息传递给相应......
  • 链表只有面试有用?Redis 之父说:我不同意
    几天前,Redis之父 SalvatoreSanfilippo(又名antirez)在Twitter上用Rust实现了一个糟糕的链表,引发了大家的讨论。在评论中,不少人觉得链表这种数据结构一无是处,于是几天后,antirez发了一篇博客。原文见:http://antirez.com/news/138antirez说:“从某些评论的语气中,我感觉到很多人......
  • 面试-集合
    hashMap扩容大于当前容量0.75,扩容成2倍。创建一个新空数组,重新hash初始容量16链表大于8转换为红黑树,小于6退化为链表indexindex=HashCode(Key)&(Length-1)index的结果等同于HashCode后⼏位的值。只要输⼊的HashCode本身分布均匀,Hash算法的结果就是均匀的hashTable在很......
  • 新一代包管理工具 pnpm 使用心得
    最近将几个项目的包管理器都由npm切换为了pnpm,迁移体验非常棒,算得上是个人体验最好的一次工具迁移。以下是使用pnpm的直观感受:体验优良,依赖安装速度极快,占用磁盘空间小。上手简单,绝大部分npm/yarn项目可以低成本完成迁移,官方也有较详尽的中文文档。pnpm组织no......
  • Spire.XLS of.net 怎么设置字体样式(普通单元格和带公式的单元格)
    普通的设置就直接套用官方文档即可//创建字体ExcelFontfont1=workbook.CreateFont();//设置字体,字形,大小,颜色font1.FontName="宋体";font1.IsBold=true;font1.Size=10;font1.KnownColor=ExcelColors.Blue;//为A1单元格......
  • 沃罗诺伊图 (Voronoi diagram)
    沃罗诺伊图(Voronoidiagram)Introduction:whatisvoronoidiagram?沃罗诺伊图(Voronoidiagram),取名自俄罗斯数学家乔治·沃罗诺伊(GeorgyVoronoi)。这是一个自然界中经常出现的简单的数学震撼(笑),在科学技术领域也有许许多多的应用(图像处理、路径规划..好像是)以上面的Vor......
  • SROP-smallest
    第一次打srop,题目来源是https://github.com/ctf-wiki/ctf-challenges/blob/master/pwn/stackoverflow/srop/2016-360%E6%98%A5%E7%A7%8B%E6%9D%AF-srop/smallest这个原理是从hollk师傅的博客中搬来的https://hollk.blog.csdn.net/article/details/107512670?spm=1001.2014.3001.5......