UVA-11987-Almost Union-Find-并查集的基本操作合并、删除、移位
I hope you know the beautiful Union-Find structure. In this problem, you’re to implement something similar, but not identical. The data structure you need to write is also a collection of disjoint sets, supporting 3 operations:
Initially, the collection contains n sets: {1}, {2}, {3}, . . . , {n}.
题意:
涉及到并查集的删除操作
1 合并这两个集合
2 将p移到q集合中去
3 统计元素个数和全部元素的和 相当于询问输出结果
5 7 ->5个集合,7种操作
1 1 2
2 3 4
1 3 5
3 4 ->3 12
2 4 1
3 4 ->3 7
3 3 ->2 8
- #include<iostream>
- #include<stdio.h>
- using namespace std;
- typedef long long ll;
- const int N=1e5+;
- int f[N*],ii[N*],num[N*];
- ll sum[N*];
- int n,m,cnt;
- void init()
- {
- for(int i=;i<=n;i++)
- {
- f[i]=i;
- ii[i]=i;
- sum[i]=i;
- num[i]=;
- }
- cnt=n;
- }
- int getf(int x)
- {
- if(f[x]==x)
- return x;
- return f[x]=getf(f[x]);
- }
- void merge(int x,int y)
- {
- int t1=getf(ii[x]);
- int t2=getf(ii[y]);
- if(t1!=t2)
- f[t2]=t1;
- num[t1]+=num[t2];
- sum[t1]+=sum[t2];
- }
- void deletee(int x)
- {
- int p=ii[x];
- sum[getf(p)]-=x;
- num[getf(p)]--;
- ii[x]=++cnt;
- sum[ii[x]]=x;
- num[ii[x]]=;
- f[ii[x]]=ii[x];
- }
- int main()
- {
- int op,p,q;
- while(~scanf("%d %d",&n,&m))
- {
- init();
- for(int i=;i<=m;i++)
- {
- scanf("%d",&op);
- if(op==)//合并这两个集合
- {
- scanf("%d %d",&p,&q);
- if(getf(ii[p])==getf(ii[q]))
- continue;
- else
- merge(p,q);
- }
- else if(op==)//将p移到q集合中去
- {
- scanf("%d %d",&p,&q);
- if(getf(ii[p])!=getf(ii[q]))//如果不在同一个集合中
- {
- deletee(p);
- merge(p,q);
- }
- }
- else if(op==)//统计元素个数和全部元素的和 相当于询问输出结果
- {
- scanf("%d",&p);
- int k=getf(ii[p]);
- printf("%d %lld\n",num[k],sum[k]);
- }
- }
- }
- return ;
- }
UVA-11987-Almost Union-Find-并查集的基本操作合并、删除、移位的更多相关文章
- UVA 11987 Almost Union-Find (并查集+删边)
开始给你n个集合,m种操作,初始集合:{1}, {2}, {3}, … , {n} 操作有三种: 1 xx1 yy1 : 合并xx1与yy1两个集合 2 xx1 yy1 :将xx1元素分离出来合到yy ...
- BZOJ4668: 冷战 [并查集 按秩合并]
BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...
- bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...
- 【bzoj4668】冷战 并查集按秩合并+朴素LCA
题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- Dash Speed【好题,分治,并查集按秩合并】
Dash Speed Online Judge:NOIP2016十联测,Claris#2 T3 Label:好题,分治,并查集按秩合并,LCA 题目描述 比特山是比特镇的飙车圣地.在比特山上一共有 n ...
- UVA 572 油田连通块-并查集解决
题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...
- UVA 12232 - Exclusive-OR(带权并查集)
UVA 12232 - Exclusive-OR 题目链接 题意:有n个数字.一開始值都不知道,每次给定一个操作,I a v表示确认a值为v,I a b v,表示确认a^b = v,Q k a1 a2 ...
- UVA 1160 - X-Plosives 即LA3644 并查集判断是否存在环
X-Plosives A secret service developed a new kind ofexplosive that attain its volatile property only ...
随机推荐
- MyBatis中大于和小于号的转义写法
mybatis 中 SQL 写在mapper.xml文件中,而xml解析 < .>.<=.>= 时会出错,这时应该使用转义写法. 方式一 < <= > > ...
- bean创建
看<spring源码解析>的笔记 1.通过@Bean创建bean,类上需要添加@Configuration @Configuration public class MainConfig { ...
- MySql 字段类型对应 Java 实体类型
前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...
- java script 基本函数
Math.random() 是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值. 日期时间函数(需要用变量调用):var b = new Date(); // ...
- bzoj1008题解
[题意分析] 求长度为n,元素大小在[1,m]∩N的序列中,有多少个序列中存在相同的相邻元素. [解题思路] 小学奥数题.. 总序列数:S=mn 不存在相同的相邻元素的序列数:T=m*(m-1)n-1 ...
- NX二次开发-创建直线UF_CURVE_create_line与NXOpen->CreateLine
NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <NXOpen/CurveCollection.hx ...
- 测试VPS
wget freevps.us/downloads/bench.sh -O - -o /dev/null|bash
- 《DSP using MATLAB》Problem 8.42
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 将Mysq数据导入solr索引库
本文的基础环境都是在centos 64bit,jdk1.7.79 将mysql 的jar 包添加到/home/hadoop/cloudsolr/solr-4.10.4/contrib/dataimpo ...
- C++之变量
变量 **作用**:给一段指定的内存空间起名,方便操作这段内存 **语法**:数据类型 变量名 = 初始值; 语法:数据类型 变量名 = 初始值; 记得加英文分号结束语句 > 注意:C++ ...