首页 > 其他分享 >并查集基础 &打击罪犯

并查集基础 &打击罪犯

时间:2023-12-30 15:45:23浏览次数:21  
标签:打击 正整数 int 查集 fa 罪犯 fi 1010

并查集基础 真的很基础

题目描述:Description

某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n)。现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/2。为达到最好的效果,他们将按顺序打击掉编号1到k的犯罪团伙,请编程求出k的最小值。

Input Format

第一行一个正整数n。接下来的n行每行有若干个正整数,第一个整数表示该行除第一个外还有多少个整数,若第i行存在正整数k,表示i,k两个团伙可以直接联系。

Output Format

一个正整数,为k的最小值

Sample

样例输入

7
2 2 5
3 1 3 4
2 2 4
2 2 3
3 1 6 7
2 5 7
2 5 6

样例输出

1

题目分析:

由题可知,我们需要打击1~k个犯罪团伙,来让其最大的总数不超过n/2(n<<1)。

1.如果我们正向遍历并查集的话,就需要在并查集内删点,这个操作对并查集并不是很友好。所以可以考虑另外一种方法。

2.既然要打击1~k的罪犯,我们不如从第n个团伙开始建立集合,每次加边时判断一下是否满足(<=n/2),直到不能满足题意为止。

AC code:

#include<bits/stdc++.h>
using namespace std;
#define s(n) scanf("%d",&n)
int n,m,a[1010][1010],z,ans,dgr[1010]={1},lst=0,mx,f[1010];
bool fg[1010]={0}; 
inline bool check(){
	int ch = 0;
	for(int z=1; z<=n; z++){
		ch = max(dgr[z],ch);
	}
	if(ch <= n/2) return true;
	return false;
}
inline int ff(int k){
	if(f[k] == k) return k;
	else return ff(f[k]);
}
int main(){
	for(int i=0; i<1010; i++) dgr[i] = 1, f[i] = i;
	s(n);
	for(int i=1; i<=n; i++){
		s(m);
		fg[i] = 1;
		int cnt = 1;
		for(int j=1; j<=m; j++){
			s(z);
			a[i][cnt++] = z;
		}
	}
	for(int i=n; i>=1; i--){
		for(int j=1; a[i][j]; j++){
			if(a[i][j] > i){
				int fi = ff(i), fa = ff(a[i][j]);
				if(fi != fa){
					dgr[fi] += dgr[fa];
					f[fa] = fi;
					if(!check()){
						printf("%d",i);
						return 0;
					}
				}
			}
		}
	}
	return 0;
}

标签:打击,正整数,int,查集,fa,罪犯,fi,1010
From: https://www.cnblogs.com/xiaolemc/p/17936449.html

相关文章

  • 并查集
    并查集并查集是一种采用树形结构存储的集合,可以高效的查找两个元素是否在一个集合当中以及合并两个集合。这里的树形结构并非仅指二叉树,而是一个节点可以有多个孩子。对于一个并查集的节点,它可以有两个元素,一个存储该节点的数据,另一个用来指向其父节点。当然当我们所存储的元......
  • [NOIP2010 提高组] 关押罪犯 - 洛谷
    P1525[NOIP2010提高组]关押罪犯-洛谷|计算机科学教育新生态(luogu.com.cn)种类并查集#include<bits/stdc++.h>#definedebug(a)cout<<#a<<"="<<a<<'\n';usingnamespacestd;usingi64=longlong;typedefpair<i64,i64>......
  • (来一套)JavaScript并查集模板
    code: classUnionFind{constructor(n){this.parent=Array.from({length:n},(_,i)=>i);this.size=newArray(n).fill(1);this.cnt=n;}findset(x){if(this.parent[x]===x){returnx......
  • 带权并查集
    对于种类并查集主要是考虑清楚到根节点距离分为几类,每一类的意义有的题目相出d数组的含义才能想到用带权并查集//find函数需要变化intfind(intx){if(p[x]!=x){introot=find(p[x]);d[x]+=d[p[x]];p[x]=root;}retur......
  • 并查集基础版
    并查集(byd打到一半没保存直接关了乆乆乆)并查集是一种数据结构,它可以用一个优秀的时间复杂度(路径压缩后接近\(O(1)\))来维持多个集合之间的关系,并进行查找和合并。查找操作我们可以定义一个并查集数组\(p[i]=j\)表示\(i\)的父亲(并查集实际是把一个一个的集合看做树来处理)是\(j......
  • 不带权并查集——jly
    structDSU{vector<int>f,siz;DSU(){}DSU(intn){init(n);}voidinit(intn){f.resize(n);std::iota(f.begin(),f.end(),0);siz.assign(n,1);}intfind(intx){......
  • 第 132 场周赛——质数小结论,并查集配Floyd
    https://www.acwing.com/activity/content/competition/problem_list/3648/B题收获:1.利用题目告诉的结论:1e9范围质数之差小于3002.一个数不被2-a的任何数整除等价于他的最小质因子需要大于ac题:初步宏观思路:不难想到用并查集维护类别,只需将每一个类缩成一个点,由于最多只有500......
  • DFS序和欧拉序的降维打击
    1.DFS序和时间戳1.1DFS序定义:树的每一个节点在深度优先遍历中进、出栈的时间序列。如下树的dfs序就是[1,2,8,8,5,5,2,4,3,9,9,3,6,6,4,7,7,1]。下图为生成DFS的过程。对于一棵树进行DFS序,除了进入当前节点时对此节点进行记录,同时在回溯到当前节点时对其也记录一下,所以DF......
  • 并查集汇总
    并查集简介并查集是一种可以动态维护若干个不重叠的结合,并支持合并与查询的数据结构并查集是一种树状的数据结构,可以用于维护传递关系以及联通性。并查集有两种操作:find:查询一个元素属于哪个集合merge:合并两个集合模板find函数intfind(intx){ if(x==fa[x]) ret......
  • 【模板】并查集 (洛谷P3367)
    1#include<bits/stdc++.h>2usingnamespacestd;3template<classT>4inlinevoidread(T&s)5{6s=0;7intw=1;8charch=getchar();9while(ch<'0'||ch>'9')10{11......