并查集—解密犯罪团伙

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

现在有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。

并查集—解密犯罪团伙_第1张图片

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。


并查集:

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

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


并查集—解密犯罪团伙_第2张图片

并查集—解密犯罪团伙_第3张图片

并查集—解密犯罪团伙_第4张图片


输入数据:

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

并查集—解密犯罪团伙_第5张图片

运行结果:



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


你可能感兴趣的:(树,森林,并查集,解密犯罪团伙)