第十周总结——并查集&&拓扑排序

21 篇文章 1 订阅

       这两周周学习了拓扑排序和并查集,在课堂上会有一部分知识点是没法完全理解的,通过看博客,深入学习了一些知识点,通过一些图更形象的理解了其中的逻辑关系。并查集&&拓扑排序的题目也开始读题理解题意,之前搜索中有关并查集和拓扑排序的题目也重新拿出来分析了一下,下面我想从四个部分总结一下本周所学:

1、奶酪:[NOIP2017 提高组] 奶酪 - 洛谷

题意:判断奶酪中的现有空洞是否可以从奶酪底连通(空洞相切或相交)到奶酪顶。

       这是一道可以搜索也可以并查集题目,先从它下手吧!本来上一次总结想要写这道题,但是又涉及到并查集,就放到这一次了。我们要判断奶酪中这些空洞的相连,是否可以贯穿奶酪,最理想的是这些空洞垂直,这样只需直径相加即可,但有些不是垂直,这时我们需要怎么办呢?

       运用并查集,参考了一些大佬的代码后,我的思路是:找到两个洞,当两个洞 i , j 可以连在一起时就可以把它们的编号放在一个集合里(即f [ find( i ) ] = find( j )),连成一个大洞,记录下这个大洞的可以达到的最上方与最下方的坐标。然后再寻找可以相连的其他洞,最后全部相连后若满足最低处为0,最高处为奶酪高度即可。

        我还看到了另一种思路:将底边设为father[0],最高处设为father[n+1],如果当前点的高度加半径大于最高高度,将该点与n+1放入同一个并查集;如果当前点的高度减去半径小于0,将该点和0放入一个并查集。枚举每两个点,如果能够连通则放入同一个并查集。最后判断0和n+1是否在一个并查集内即可。我所理解的这个思路就是从两端开始找洞,往内部延伸,若两头的线路可以连接,则为Yes.

2、对于并查集:

强推一篇博客:http://t.csdn.cn/dftPU  我感觉这篇博客对于并查集的初学者来说,根据故事与图会更容易理解一些.

并查集:并查集具备两个操作:(1)查询元素a和元素b是否为同一组   (2) 将元素a和b合并为同一组。但并查集不能将在同一组的元素拆分为两组。所以在许多题目中需要用到反向并查集、并查集删边,比如说:ZOJ3261 Connections in Galaxy War

我们在使用并查集时,可以把并查集当作树形结构来实现,使用树形结构来表示以后,每一组都对应一棵树,两个元素是否为一组只需看这两个元素的根是否一致。合并时是我们只需要将一组的根与另一组的根相连即可。

我目前总结的并查集的应用场景:1、查找元素属于哪个集合 2、检索两个元素是否属于同一个集合 3、将两个集合归并成一个集合,元素合并、修改某一集合的名称 4、统计集合的个数

3、Cow Contest S:[USACO08JAN]Cow Contest S - 洛谷

题意:每只牛若两两相连,则有输赢;若不相连,则无法比较,输出可以确定排名(都相连)的牛的只数。

        最初看到这个题时,一直没明白其中的逻辑关系,以及该如何表达,学习了拓扑排序后恍然大悟(整个世界都亮堂了的感觉)。使用拓扑排序,若两头牛之间有输赢,则代表两头牛之间有连通,从赢的牛到输的牛之间有一条有向边,胜负关系其实就是一条单向边,其实只要求有多少只牛的度为n-1即可,不过有一个条件是,如果A打赢B,B打赢C,那么A就打赢了C。看到题解中许多大佬用floyed算法写这道题,之后学习floyed之后也要回来重新试一下这道题。

4、对于拓扑排序:

首先放张图

我觉得这张图是我理解拓扑排序最直观最有效的一张图了😀 

最常用的组合时拓扑排序+优先队列,因为很多题目在输出时需要把编号最大或最小的输出,这时就需要优先队列来帮我们排序,不然会很麻烦。拓扑排序最常见的应用场景就是各种比赛,输者和赢者之间会有一条有向边,从而可以判断最终赢家是谁。

拓扑排序的经典算法:
1) 选择入度为0的节点输出;
2) 从有向图中删除此节点以及出边;
3) 循环上述过程,直到有向图中无节点或无入度为0的节点,循环结束;
4) 若循环结束后,如果有向图中无节点,那么说明可以拓扑排序;如果有向图中仍存在节点,那么说明存在环,即不可被拓扑排序。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值