首页 > 其他分享 >HDU - 2473 (并查集+设立虚父节点(马甲))

HDU - 2473 (并查集+设立虚父节点(马甲))

时间:2023-06-07 22:26:29浏览次数:58  
标签:HDU 2473 vis int 查集 find fa 节点

涉及到并查集的删除操作,比较复杂,可以利用虚设父节点的方法:

例如 : 有n个节点,进行m次操作.首先将0 ~ n-1的节点的父节点设置为i + n,n ~ 2n+1的节点的父节点设置为本身,有m次操作,所以要用到m个虚节点,例如0,1,2,3,4,5的父节点为7,8,9,10,11,把他们插入2的集合,所以他们的根节点都为8,当把2从集合中移除时就可以把2的根节点设置为没有用到的数12,所以此时0,1,3,4,5的根节点为8,2的根节点为12,形成了两个独立的集合

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+10, M = 1e6+10;
int fa[N+N+M],n,m,id;
bool vis[N+N+M];

int find(int x){
	if(fa[x]==x) return x;
	return fa[x] = find(fa[x]);
}

void joint(int x,int y){
	x = find(x), y = find(y);
	if(x!=y) fa[x] = y;
}

int main(){
	while(scanf("%d %d",&n,&m)&&(n+m)){
		memset(vis,0,sizeof vis);
		for(int i=0;i<n;i++) fa[i]=i+n;
		for(int i=n;i<n+n+m;i++) fa[i]=i;
		int temp = n+n;
		while(m--){
			char flag;
			int x,y;
			scanf("%s",&flag);
			if(flag=='M'){
				scanf("%d %d",&x,&y);
				joint(x,y);
			}
			else{
				scanf("%d",&x);
				fa[x] = temp++;
			}
		}
		int ans = 0;
		for(int i=0;i<n;i++){
			if(!vis[find(i)]){
				ans++;
				vis[find(i)] = 1;
			}
		}
		printf("Case #%d: %d\n",++id,ans);
	}
	return 0;
}

标签:HDU,2473,vis,int,查集,find,fa,节点
From: https://www.cnblogs.com/kingqiao/p/17464682.html

相关文章

  • 数据结构与算法分析(Java语言描述)(24)—— 并查集的路径压缩
    packagecom.dataStructure.union_find;//我们的第五版Union-FindpublicclassUnionFind5{//rank[i]表示以i为根的集合所表示的树的层数//在后续的代码中,我们并不会维护rank的语意,也就是rank的值在路径压缩的过程中,有可能不在是树的层数值//这也是......
  • 三个博弈-巴什博奕、威佐夫博弈、尼姆博弈。acm博弈算法笔记HDU 2149,1850,1527
    博弈论(一)、acm博弈基础算法BashGame,NimGame和WythoffGame(即巴什博奕、尼姆博弈、威佐夫博弈)Bash  Game: 同余理论Nim   Game: 异或理论WythoffGame: 黄金分割(二)、三个博弈。1、巴什博奕。只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,......
  • 树状数组讲解与例题 杭电HDU1166,HDU1556,HDU2689
    树状数组的总结树状数组很巧妙地解决了数列的求和与查找,速度很快。树状数组,它改变数列中某一位,或者求某个区间的和,时间复杂度是O(logN);效率大为改善。下面的图片很好的演示了树状数组的存储原理。(图片来自网络)观察图片,会发现:数组c的每一个元素都管辖着一定范围内的数组a元素的和,比如C......
  • HDU 5542 The Battle of Chibi(树状数组+dp)
    TheBattleofChibiTimeLimit:6000/4000MS(Java/Others)    MemoryLimit:65535/65535K(Java/Others)TotalSubmission(s):1749    AcceptedSubmission(s):621ProblemDescriptionCaoCaomadeupabigarmyandwasgoingtoinvadethewholeSou......
  • ICPC2015(沈阳)HDU5521 建图技巧+最短路
    MeetingTimeLimit:12000/6000MS(Java/Others)  MemoryLimit:262144/262144K(Java/Others)TotalSubmission(s):3533  AcceptedSubmission(s):1136ProblemDescriptionBessieandherfriendElsiedecidetohaveameeting.However,afterFarmerJohndecor......
  • HDU2227(非降子序列的个数)
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2227题意:给定一个长度为n(n<=100000)的整数序列,求其中的非降子序列的个数。分析:如果n的值比较小,那么就是一个纯粹的dp题。设dp[i]表示以a[i]为结尾非降子序列的个数,其状态转移方程为:      可以看出,这样做的时间复杂度是......
  • HDU4372(第一类斯特林数)
    题目:CounttheBuildings题意:N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数。0<N,F,B<=2000首先我们知道一个结论:n的环排列的个数与n-1个元素的排列的个数相等,因为P(n,n)/n=(n-1)!。可以肯定,无论从最左边还是从最右边看,......
  • HDU4633(Polya计数)
    题目:Who'sAuntZhang#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;typedeflonglongLL;constLLMOD=10007;LLquick_mod(LLa,LLb){LLans=1;a%=MOD;while(b){if(b&1......
  • HDU4382(特殊的矩阵连乘)
    题目:HarryPotterandCyberSequenceGenerator题意,有两个容器C1,C2,初始的时候C1中有一个数的值为V,给你K个操作,每次都重复这K个操作N遍,最后问你C2中的数是   多少。N<=10^100。1:循环操作的次数巨大,敏感的想到这是矩阵连乘的题目。2:K个操作可以得出一个矩阵,N个K操作就是这个......
  • HDU1524(博弈--有向无环图SG函数)
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输.分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值......