警察想查清楚有几个犯罪团伙,搜集到了一些线索:
现在有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