并查集超强解析
前言 an是看了某大佬的文章忽然就懂了的。 一直很想写一个解析,可是苦于没时间。 现在终于出炉了。 正文 (有点幼稚勿喷,自编) 江湖上散落着各式各样的大侠。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的帮派,通过两两之间的朋友关系串联起来。而不在同一个帮派的人,无论如何都无法通过朋友关系连起来,于是就可以放心往死里打。 假设我们知道有pre[i]确定了i的上级(朋友),那么问题来了。 怎么确定两个人是同意帮派的人咧?只需要确定自己的队长是谁就好了,这时find函数就派上用场了: int find(int x) //查找根结点(队长) { while(x != pre[x]) //我的上级不是队长 x = pre[x]; return x;//返回队长 } 大诗仙李白听说这消息很是激动,拜师学剑,数载学成归来,约了武林高手花木LAN与荆轲二人商讨组建一个帮派,于是花木LAN和荆轲两人到处拉人。于是形成了“李白帮派”: 达摩本拜橘右京为师,组成帮派,可是达摩跟花木兰成为了好朋友。本来橘右京跟李白打得死去活来,风云搅动,这样一来,京京不得不停手: