反思 并查集

最近其实并没有刻意去练并查集,不过昨天和今天做到了两道题目,均是用并查集来解决的

在解决这两道题目的过程中,我在运用并查集的时候,都出现了严重的错误。

具体表现在,思路很清晰,应该怎么做也很明白,但是在处理的过程中对并查集的操作并不正确。很多时候都出现了由于对两个节点互相赋值而造成的find函数中的死循环。

然而我并不清楚是什么原因。


其中一一道题目,是赛码杯1003 是一个判断是否存在 奇环和偶环 的题目,这道题目bin神讲了黑科技解法..一个点分成两个,然后编号奇偶点,通过并查集来判断2*u+1 和 2*u的关系 以及 2*u+1 和 2*v 的关系 来判断是否可以构成奇偶环~涨姿势!

可是我在实现的时候出现了错误,在用并查集的时候,因为并没有按照并查集正确的压缩路径的方式来合并,而是按照自己的想法胡乱地合并和判断,所以总会造成两个结点互为父节点,在find函数中出现了死循环。后来问一帆巨巨要了代码才写对


第二道题目就是今天做的福州校赛中的C题,很明显的并查集题目。

无论是商店的位置 还是顾客的位置,都并不能一次确定。

我想着在一开始的n个条件中,只是单纯的给出商店的位置信息,所以只是简单的把商店的父节点改成了位置信息,并没有进行并查集的find过程和union过程

在后面紧接着的m个条件中,我也只是用赋值的方式,强行把某两个节点的父节点给改了。这种处理方法,同样造成了find函数中的死循环。

后来也是看了一帆巨巨的博客,然后严格采用了union的格式,解决了这个死循环的问题之后,就能AC


通过做这两道并查集的题目,自己下次再用并查集的时候,一定要认真处理时用并查集的部分,想清楚也写明白。不要出现两个节点互为父节点的情况了。。T_T

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值