码迷,mamicode.com
首页 > 其他好文 > 详细

并查集—解密犯罪团伙

时间:2015-02-05 09:38:33      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:并查集   解密犯罪团伙      森林   

警察想查清楚有几个犯罪团伙,搜集到了一些线索:

现在有10个强盗;

1号强盗与2号强盗是同伙;

3号强盗与4号强盗是同伙;

5号强盗与2号强盗是同伙;

4号强盗与6号强盗是同伙;

2号强盗与6号强盗是同伙;

8号强盗与7号强盗是同伙;

9号强盗与7号强盗是同伙;

1号强盗与6号强盗是同伙;

2号强盗与4号强盗是同伙;


强盗同伙的同伙也是同伙,请问一共有多少个独立的犯罪团伙?


基本思路:

1.一维数组f,表示10个强盗,值存储每个强盗的boss是谁。

2.初始化,开始boss都是自己,f[i]=i。

技术分享

3.合并同伙,“靠左”法则,“1号强盗与2号强盗是同伙”,2号的boss变成了1号,f[2]=1。

技术分享

。。。。。。

第三条线索:“5号强盗与2号强盗是同伙”,2号的boss目前是1号,“擒贼先擒王”,那么让1号的boss直接变为5号,即f[1]=5,f[2]=5。

。。。。。。


最终结果:

技术分享


如果f[i]=i,就表示此人是一个犯罪团伙的最高领导人,有多少个独立的团伙,等于看最终结果中有多少个f[i]=i。


并查集:

通过一个一维数组来实现,其本质是维护一个森林。刚开始的时候,森林的每个点都是孤立的,也可以理解为每个点就是一棵只有一个节点的树,之后通过一些条件,将这些树合并成一棵大树。

合并过程中,“靠左”法则和“擒贼先擒王”原则。


技术分享

技术分享

技术分享


输入数据:

第一行n,m,分别表示强盗人数,和线索条数,接下来m行有两个数a,b,表示a和 b是同伙。

技术分享

运行结果:

技术分享


并查集也称为不相交集数据结构。


并查集—解密犯罪团伙

标签:并查集   解密犯罪团伙      森林   

原文地址:http://blog.csdn.net/wtyvhreal/article/details/43494647

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!