本周acm并查集心得

        上周和这周看的全是并查集和一点拓扑排序,然后看的差不多了之后这几天做了一些并查集的题。说实话,这类的确实比别的算法稍微简单点,我感觉几乎都是套用并查集的惯用套路,然后再根据题意加上一些思维,在原模板的基础上加上限制条件或者稍微修改一下就能解决很多题,(也可能是是我看的题太简单了么😭,当然肯定比不上费老上课讲的那仨题,除了第一个听的挺懂的,后俩感觉真难,有空还得再琢磨一下,看的那些题都没遇到过这么难的┭┮﹏┭┮,可能有过几个但是从开始就卡壳了,不过有一说一,还是听着老师讲难题的时候懂得更透嘻嘻)至少我这几天做的这几个洛谷上的题还没做到那个难度的,基本上能自己解决或者卡在某个点不知道怎么实现看一下题解怎么做的就差不多了。,前期主要是看题做的还不是很多

      当然如果这些不是并查集例题的话我可能都不会想起来用这个,受前几周的影响如果猛一下看到这些题第一反应应该都是搜索,算法都是互通的,感觉这些并查集的题都能用搜索写出来,也就是复杂度不同吧。当然,解决问题嘛,肯定要找注重最优解咯,比较哪个方法最方便简单高效才是重要的吧~

 

   都说到这了 做某些题时的一些感想和见解当然忍不住想要在这分享和纪录下来了,然后一些心得体会就直接在相应的地方说啦就不单独拿出来了

P1195 口袋的天空

什么叫举一反三,这算不算,(虽然好像不够三😁)不是说n个结点构成一棵树有n-1个路径么,那这个题让n朵云各自相互连接最后就会有k大块云(虽然不是树但可以看做树),这样看的话也就是n个点构成k个树,所以就有(n-k)条边咯

(也可能以前碰见过但我只用结论没有多思考过一个字,我就喜欢这种“恍然大悟”的感觉‘🤗🤗,虽然就是个小小悟叭,但不管是简单还是难的只要是独立或者通过联想想到解决问题的办法就会给人一种很好的感觉)所以就只需要在合并了n-k次时输出和就可了,如果不够这些次数,就自然而然的构不成k个树了,别的地方也全部都是搬用套路了

下面这个题反正是个典型的规律套路水题吧 ,那么就用这个题浅说一下这种类似的套路吧

P1396 营救

像这类的求某点到某点的最小或最大权值和或多条边中的找出最小最大权值,只需要用 套路+sort对权值排序 即可,这样合并的时候肯定是权值小(或大)的优先就能保证最小或最大和了,最小或最大则是排序后再合并时最后一个边的权值不就是最值嘛

温馨tip:当有两点的根节点一样时,就说明这两点之间连通了(某些题中会用到)

啊这 下面这个题有一个新颖的地方是其他题没有的,就是用到了桶排序和一个转换思维

​​​​​​ P1536 村村通

在解决这个问题中,需要知道一共有多少连通块---->求根节点的个数------>然后.......

然后就没然后了,我的思维好像突然暂停了(其实是想不起来了😥)

咋在这个题里方便的查根节点呢(盲目写了,但没写对,用搜索看有多少联通快应该可以但是怪麻烦的在这好像大材小用了吧感觉),也不知道是因为我偷看了题解还是因为我偷看了题解,他们说因为数据很少一千以内所以直接建个桶数组直接让下标是根节点的那个a【i】等于一最后循环一遍输出就行

 PS1:在做题时我还发现了这样一个规律,在看题解时好多人都在用最小生成树或题目中直接让球最小生成树时(还真有个题就很直接的说求最小生成树也不用让人猜题意了),那就百分之九十九的可能性有用并查集的而且也可以用并查集来解决

  PS2: 所以我认为并查集就是一棵或多棵树,而且在不同的树中他们的元素是没有重叠的,所以当遇到几个集合且没有重复元素的这样的题可以优先考虑一下并查集看看是不是在它能解决的范围内(当然还有求连通块个数,求某个东西在哪个连通块中,求某两个东西在不在一个集合里面等,还有区间类的题目)

又长见识了又长见识了............看并查集的题遇见环了

虽然不是什么稀罕事,但是通过前几天的看题,(可能也是我看的太浅了没有多想)一说到并查集我的第一反应就是点之间的联通问题集合问题,而且脑子第一想到的图就是几棵树,从没有想过环这个图形啊,就是这个题

​​​​​​ P1536 村村通

如果不是因为刚学了并查集这都是此类例题,我第一个想到的肯定就是用dfs(因为别的也不会了😶),利用入度为0找出不可能是环的点删除,最后把所有入度为0的点都删了,剩下的就是环,然后用 dfs,找出最小的环。(因为刚学了并查集所以这是第二反应想到的hh)因为要找环,所以遍历点时如果有两个点祖先节点相同,那么就是一个环,然后此时记录整个环长度就好了,就这么一下子的事,只要想到那一点就行呗,但我就怎么偏偏总看别人动脑子思考的结果😵

我每次一遇到自己感觉稍微陌生点的题就会有个不好的心理暗示说又要不会了,这个也是,明明这个题不算难,明明看了题解之后很易懂,但看之前怎么就不往这想想呢,看答案之前我就会自我暗示“肯定想不起来又要看题解了”,还没开始就放弃了怎么行呢,这可不是我应有的作风

更何况并查集和别的算法比起来算是简单点的,趁着这周看的题目那些思想,并查集应该只剩下一周集中的时间了,从明天明天,哦不对,是今天,已经零点了,相信自己这类题思路没有那么难想,一定要锻炼一下自己的思维,虽然积累很重要,但独立思考依然重要,不能完全一直依靠答案,一定要 先思考,思考,独立思考,动脑子,动脑子,再看题解!!相信会有不一样的收获!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
并查集是一种用于解决集合合并与查询问题的数据结构。在食物链问题中,我们可以使用并查集来判断给定的K句话中有多少句是假话。 首先,我们需要创建一个并查集,其中每个动物都是一个节点。初始时,每个节点都是独立的集合。 然后,我们按照给定的K句话进行处理。对于每一句话,我们需要判断它是真话还是假话。 如果是第一种说法"1 X Y",表示X和Y是同类。我们可以通过将X和Y所在的集合合并来实现。即将X所在的集合的根节点指向Y所在的集合的根节点,或者将Y所在的集合的根节点指向X所在的集合的根节点。 如果是第二种说法"2 X Y",表示X吃Y。我们需要判断X和Y是否属于同一类。如果它们属于同一类,那么这句话就是假话。否则,这句话是真话。 最后,我们统计假话的总数即可。 以下是一个示例代码,演示了如何使用并查集解决食物链问题: ```python class UnionFind: def __init__(self, n): self.parent = list(range(n)) self.rank = [0] * n def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): root_x = self.find(x) root_y = self.find(y) if root_x == root_y: return if self.rank[root_x] < self.rank[root_y]: self.parent[root_x] = root_y elif self.rank[root_x] > self.rank[root_y]: self.parent[root_y] = root_x else: self.parent[root_y] = root_x self.rank[root_x] += 1 def count_false_statements(N, K, statements): uf = UnionFind(N+1) false_count = 0 for statement in statements: type, X, Y = statement if X > N or Y > N: false_count += 1 continue if type == 1: if uf.find(X) == uf.find(Y+N) or uf.find(X+N) == uf.find(Y): false_count += 1 else: uf.union(X, Y) uf.union(X+N, Y+N) uf.union(X+2*N, Y+2*N) elif type == 2: if uf.find(X) == uf.find(Y) or uf.find(X+N) == uf.find(Y): false_count += 1 else: uf.union(X, Y+N) uf.union(X+N, Y+2*N) uf.union(X+2*N, Y) return false_count N = 5 K = 7 statements = [(1, 1, 2), (2, 1, 3), (1, 2, 3), (2, 2, 4), (1, 4, 1), (1, 4, 3), (2, 4, 3)] false_count = count_false_statements(N, K, statements) print(false_count) # 输出:3 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值