阶段学习总结--并查集、拓扑排序

这篇博客深入探讨了并查集和拓扑排序在解决图论问题中的应用场景,包括判断无向图联通性、维护集合信息、处理删边问题等。并查集在连通性判断、带权合并及删边问题中的应用被详细阐述,而拓扑排序则用于确定有向图的顺序和环的检测。文中列举了多个实例,如比赛排名、食物链真假话判断、无线网络连通性等,展示了这两种算法的实际运用和优化技巧。
摘要由CSDN通过智能技术生成

并查集应用一般有如下三个题型:

1.合并查询等常规操作,常见有判断无向图中是否产生环,有多少个联通的块等。

2.带权并查集,在初始化、合并集合时,额外维护每个集合所包括的节点数;或额外维护集合中每个节点到根节点的距离,即用并查集来维护额外信息。

3.并查集的删边问题,通常用逆序建立集合进行处理,离线+逆处理。


Problem - 1232

给出一些连通的块,要想让所有块都连通,至少还要连通几次。

属于第一种题型,根据当前节点是否等于它的根节点,判断目前有多少个独立的集合

思路:先用并查集记录下来目前已经连通的节点,然后遍历所有节点,判断根节点是否都相同,若不同,则合并,ans++。(另一种思路是遍历所有节点,记录目前一共有几个独立的集合,则ans=集合数-1)

2524 -- Ubiquitous Religions

与上题相同,优化了一下判断有多少个独立集合的思维。

属于第一种题型的应用,判断有多少个独立的集合。

类似判断森林里有多少棵树,即判断有多少个独立的集合,设节点数为n,遍历每个节点,若某点的根节点是自己,则说明有一个独立的集合,ans++即可。只是判断有多少个独立集合,而不进行其他操作的话,用这种方法更快更简单。

2236 -- Wireless Network

给出矩阵中坏的电脑的坐标,只有两台距离小于d的电脑才能互相通信,进行n次操作,修复某台电脑或询问两台电脑是否能够通信。

属于第一种题型,判断祖宗节点是否相同。

思路:存储电脑坐标,若电脑间距离小于d,则用邻接矩阵存储两台电脑的无向边表示连通。电脑是否修复设置标记数组,只有电脑所在位置被修复且两台电脑之间的距离小于d,才进行合并。根据祖宗节点是否相同,即是否在同一个集合,即可判断能否进行通信。

Problem - 2120

一块领土中有很多塔,可由围墙连接起来,输入数据表示AB塔之间有围墙连接,问塔把领土分成了多少块。

属于第一种题型的应用。根据祖宗节点是否相同判断集合中有多少环。

思路:输入连通节点时进行合并,若两点的祖宗节点不同则进行合并,否则环数(ans++)。判断并查集中是否成环,即遍历节点判断他们的根节点是否相同,不相同则进行合并,此时如果有环,则会出现将要合并的两点的根节点相同的情况,即出现了环,环数++。


1611 -- The Suspects

一个可疑的患者可同时在多个组,所在的组的所有同学都被认为是可疑的患者,求一共的可疑的患者数量。

属于第二种题型,在初始化、合并集合的同时记录每个集合的节点数

思路:初始化节点,根据输入进行集合的合并,同时进行两个集合节点数的相加,最后输出可疑患者所在的集合的总节点数即可。

核心代码:初始化时每个节点的size都为1;合并时:

size[find(b)]+=size[find(a)];//a向b合并时,b节点数增加
p[find(a)]=find[b];

1182 -- 食物链

abc三种动物构成环形食物链,给出数据表示xy的关系,同类或y被x吃,若后面的描述与之前的描述冲突则为假话,求一共有几句假话。

属于第二种题型,并查集维护额外信息。

思路:给出xy关系,再给出xz的关系,一定就可以推断出xz的关系。因此,记录每个点与根节点的关系(用每个点到根节点的距离来表示),距离为1表示吃根节点,距离为2表示被根节点吃,距离为3表示与根节点同类,三种动物关系循环,用距离%3表示与根节点的关系。op==1时,若xy根节点相同,x、y到根节点%3的值不同则是假话,xy根节点不同则合并(合并时,xy父节点之间的距离应满足x到px-y到py+距离的结果%3等于0,故把xy父节点之间距离设为dy-dx)。op==2时也一样进行判断即可。

Problem - 5606

n个点n-1条边构成连通图,每条边有边权0或1,求每个点最近的点的个数。

属于第二种题型,维护size的并查集。

思路:最近的点只有自己或边权为0的点,输入时只将边权为0的点合并,合并时将每个集合的大小相加记录size即可。


Problem - 4496

有n个顶点、m条边的无向图要求依次输出当删除给出的前k条边后,该图的连通分量数

属于第三种题型,删除前K条边,仅需倒叙插入m-k条边即可

思路:按序保存好所有边和连通节点的信息,从第m-1条边开始逆序合并,每次合并若不在一个集合,ans=n,ans--

ZOJ

给出n个星球的连接关系,m个操作,删除ab边或查询与a相连的能量最大的星球,若一样大,输出编号小的。

属于第三种题型,不断删边+询问,故进行离线逆处理。

思路:读入时删除的边不进行合并,初始是需要删的边全部删完的状态,将操作储存下来离线逆处理,删除就变成了添加。合并时根据能量大小进行合并,把大的作为小的根节点,若大小相同则编号小的为根节点。



拓扑排序这周看的资料不够多,还是时间没充分用上,应该反思。已经看过的资料都是比较浅的拓扑排序的应用题,有如下几个应用:

1.根据入度确定拓扑序列,如确定比赛关系等。

2.判断有向图中是否存在环。

3.维护有向图、有序序列的相关信息。


Problem - 1285

根据输赢情况确定比赛排名,若排名不唯一,则按编号小的在前输出。

根据有向关系确定序列顺序。

思路:输赢情况用有向图来存储,根据节点入度确定排名,故用拓扑排序,编号小的先输出,若1->2,2->3,4->3,则次序为1243,也就是说4与2同级,但由于编号和排名,4必须排在2后面3前面,故用优先队列实现。(因为保证了只有节点入度为0时才入队,所以不会存在不同级的节点同时出现在队列里的情况,即每次在队列里的都是同级的,按编号大小输出即可)

Problem - 3342

给出n个人的m条关系,表示a是b的老师,但给出的关系中不能有环,即不能出现a是b的老师,b是c的老师,而c又是a的老师。

拓扑排序判断有向图是否产生环。

思路:最初想直接用并查集不断合并来判断环,后来经过验证,如果出现ac bc ab的情况,应该是合法的,但并并查集(无向)会判断为产生了环。故得出结论:并查集并不能维护有向的信息,即并查集适用于判断无向图是否产生环,拓扑排序适用于判断有向图是否产生环。通过判断是否所有点都已经入队来判断是否产生环。

Problem - 2647

n个人,m条要求说明a比b的奖金要求高,不能有环。输出最小需要的奖金数。

根据有向图的拓扑序列来维护图中每个节点的相关信息。

思路:根据m条要求存图,最初入度为0的节点设最低值,以后每层入队的节点奖金++,求出总和即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值