并查集—解密犯罪团伙

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

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

运行结果:

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

时间: 2024-08-10 19:15:51

并查集—解密犯罪团伙的相关文章

【BZOJ-4668】冷战 并查集 + 启发式合并 + 乱搞

4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 37  Solved: 24[Submit][Status][Discuss] Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争.在这段时期,虽然分歧和冲突严重,但双方都尽力避免世界范围的大规模战争(第三次世界大战)爆发

并查集(基础)

并查集, 从这个名字上也可以知道是合并和查找集合的, 它也叫不相交的集的数据结构, 典型的例题有食物链, 来判断有多少个独立的树什么的, 下面一个例题,来简单的解释并查集:一个犯罪团伙一共有n个人, 现在只知道谁跟谁一伙, 来求出一共有多少个团伙, 代码如下: 1 #include <stdio.h> 2 //并查集 3 /*此案例是给定总个数, 从1到n, 然后给定谁和谁是一伙的, 4 输入一个m来确定一个有多少个一伙的, 求出最后一个有几伙*/ 5 int f[1000], n, m, k

poj1703(Find them, Catch them)并查集

Description The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present

北大ACM1703——Find them, Catch them~~并查集

题目的意思是:在一个城市,有两个犯罪团伙.输入N(人的个数)和M(信息的个数).后面M条信息是一个字母加上两个数字i和j,如果字母为D,则说明i和j属于不同的犯罪团伙,如果字母是A,则要你判断i和j的关系,属于同一个还是属于不同的还是不确定. 一开始,觉得这个题目计较棘手,属于D的情况下,是属于不同的犯罪团伙,不知道如何来解决. 后来想到了之前看到的一题,POJ1182食物链,判断有多少条信息是错的.有三个并查集来判断动物的关系. 所以这一题,我们可以用两个并查集来判断.N最大为10^5,所以并

POJ 1703:Find them, Catch them(带权的并查集)

Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30702   Accepted: 9447 Description The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon

使用并查集来维护不同的类关系

我们理解并查集这个数据结构的时候不要过于死板,我们要知道 并查集是用来维护关系的,而不是单纯一味去归并,归并,归并 下面给出一个问题尝试用并查集来解决:一共有两个类,然后告诉你若干组数据,每一组数据的两个元素不是一类的,然后在线判断两个元素是否是同一类 这个时候如果你只会归并就行不通的,还需要一些特殊的处理 我们需要在并查集的那个数组的基础之上,需要另一个数组来记录这种特殊的现象 int set[maxn],a[maxn]; //a表示这个节点和父节点的关系,0表示相同1表示不同 接下来我们的路

【POJ - 1703】Find them, Catch them(种类并查集)

Find them, Catch them 直接翻译了 Descriptions 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人.该城有N个罪犯,编号从1至N(N<=100000.将有M(M<=100000)次操作.D a b 表示a.b是不同帮派A a b 询问a.b关系 Input 多组数据.第一行是数据总数 T (1 <= T <= 20)每组数据第一行是N.M,接下来M行是操作 Output 对于每一个A操作,回答"In the same gang.

PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]

题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls mad

CodeForces 745C Hongcow Builds A Nation 并查集

题意: 给了你n个城市 m条边 k个政府 每个政府管辖的区域内不能和其他政府的区域有相连 即政府之间不存在路径 问你在维护这种关系的同时 最多再加多少条边 思路: 先找出来每个联通块 再找出来没有归属的孤立的点 把他们都放到最大的联通块里 然后每个联通块之间的点两两连边是n*(n-1)/2条边 最后算出来的ans-m就好了 (看别人的博客学了一个max_element 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a