UVA11987 Almost Union-Find 并查集的节点删除
题意:
第一行给出一个n,m,表示 n个集合,里面的元素为1~n,下面有m种操作,第一个数为 1 时,输入a,b 表示a,b 两个集合合并到一起,第一个数为 2 时,输入a,b表示将 a 从他原来的集合中拿出来,放到集合 b 中,第一个数为 3 时,输入a,表示询问a 所在的集合的元素的个数和元素的和。
思路:
求集合所有元素的个数和元素和的时候,在两个数并为一块的时候求比较容易理解,假如a向b靠拢,那么将a 的信息归并到b里面,相当于这个集合的信息在他的根节点上。
删除节点:初始化newid[i]=i,我们用这个数组的下标来表示几号点,里面的值用++n来表示更新,数值++n的信息初始化为下标。
注意: 合并集合的时候注意谁合并到谁。
void move(int v)
{
int t=getf(newid[v]);
sum[t]-=v;
count[t]--;//原来的并查集减去相应的结果
newid[v]=++n;//找一个新节点代替 v
sum[n]=v;//它的值还是v 不变
f[n]=n;//祖先是自己
count[n]=1;//1个点
}
//以后对集合a的操作用newid[a]来代替a
看完整代码:
#include<stdio.h>
typedef long long ll;
int count[200100],f[200100],newid[200100];
ll sum[200100];
int getf(int v)
{
if(f[v]==v)
return v;
return f[v]=getf(f[v]);
}
void merge(int u,int v)
{
int t1=getf(newid[u]),t2=getf(newid[v]);//------
if(t1!=t2)
{
f[t2]=t1;
sum[t1]+=sum[t2];//t2向t1靠拢
count[t1]+=count[t2];//累加结果
}
}
int n,m;
void move(int v)
{
int t=getf(newid[v]);
sum[t]-=v;
count[t]--;//原来的并查集减去相应的结果
newid[v]=++n;//找一个新节点代替 v
sum[n]=v;//它的值还是v 不变
f[n]=n;//祖先是自己
count[n]=1;//点
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<=n; i++)
count[i]=1,newid[i]=i,f[i]=i,sum[i]=i;
int a,b,c;
for(int i=0; i<m; i++)
{
scanf("%d",&a);
if(a==3)
{
scanf("%d",&b);
printf("%d %lld\n",count[getf(newid[b])],sum[getf(newid[b])]);
}
else
{
scanf("%d%d",&b,&c);
if(getf(newid[b])==getf(newid[c]))
continue;
if(a==1)
merge(b,c);
else
{
move(b);//删除节点b
merge(c,b);//b向c靠拢
}
}
}
}
return 0;
}
UVA11987 Almost Union-Find 并查集的节点删除的更多相关文章
- <算法><Union Find并查集>
Intro 想象这样的应用场景:给定一些点,随着程序输入,不断地添加点之间的连通关系(边),整个图的连通关系也在变化.这时候我们如何维护整个图的连通性(即判断任意两个点之间的连通性)呢? 一个比较简单 ...
- 并查集(Union/Find)模板及详解
概念: 并查集是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的Kruskal 算法和求最近公共祖先等. 操作: 并查集的基本操作有两个 ...
- UVA11987 Almost Union-Find [带权并查集]
洛谷传送门 Almost Union-Find 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 5 7 1 1 2 2 3 4 1 3 5 3 4 2 4 1 3 4 3 ...
- 并查集(Union Find)的基本实现
概念 并查集是一种树形的数据结构,用来处理一些不交集的合并及查询问题.主要有两个操作: find:确定元素属于哪一个子集. union:将两个子集合并成同一个集合. 所以并查集能够解决网络中节点的连通 ...
- 并查集 (Union Find ) P - The Suspects
Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...
- 并查集(Disjoint Set Union,DSU)
定义: 并查集是一种用来管理元素分组情况的数据结构. 作用: 查询元素a和元素b是否属于同一组 合并元素a和元素b所在的组 优化方法: 1.路径压缩 2.添加高度属性 拓展延伸: 分组并查集 带权并查 ...
- 第三十一篇 玩转数据结构——并查集(Union Find)
1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现 2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两 ...
- 并查集(不相交集)的Union操作
在并查集(不相交集)中附加操作\(Deunion\),它实现的功能是取消最后一次\(Union\)的操作. 实现思想 初始化一个空栈,将每一次的\(Union\)操作的两个集合的根和其值\(Push\ ...
- Mutual Training for Wannafly Union #6 E - Summer Trip(并查集)
题目链接:http://www.spoj.com/problems/IAPCR2F/en/ 题目大意: 给m个数字代表的大小,之后n组数据,两两关联,关联后的所有数字为一组,从小到大输出组数以及对应的 ...
随机推荐
- 微信小程序采坑之scroll-view
当设置了scroll-y为true之后,纵向是没有问题的,会出现滚动条. Android上一切都是那么的祥和, ios上你会发现如果你scroll-view里面的东西超过横向的宽度时,就会隐藏了. 也 ...
- 软件工程实验一 Git代码版本管理
实验一 GIT 代码版本管理 一.实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)熟练掌握git的基本指令和分支管理指令: 二.实验内容: 1)安装git: 2)初始配置git ,gi ...
- 超全!python的文件和目录操作总结
文件的基本读写 path = r'C:\Users\Brady\Documents\tmp' with open(path + r'\demo.txt', 'r', encoding='utf-8') ...
- Manjaro 19.01 kde下Tim sogou软件安装问题及解决
我的系统配置 首先第一个问题是,在manjaro下Tim Thunderspeed这种deepin-wine的软件.今天我在装这些软件的时候,安装之后不能打开,闪退.苦恼了我好一会儿.终于找到了解决的 ...
- MySQL的字符集和乱码问题
1.字符集知识 #概述 .字符集是一套文字符号及其编码.比较规则的集合,第一个计算机字符串ASC2 .mysql数据库字符集包括字符集(character)和 校对规则,其中字符集使用来定义mysql ...
- 不一样的ZTree,权限树.js插件
每一个有趣的创新,都源于苦逼的生活. 在最近的工作中,遇到一个做权限管理筛选的需求.简单总结需求:1展示一个组织中的组织结构2通过点击组织结构中的任意一个节点可以向上向下查询对应的组织结构 如果你不想 ...
- 前端javascript知识(一)
介绍一下 JS 的基本数据类型. Undefined.Null.Boolean.Number.String 介绍一下 JS 有哪些内置对象. Object 是 JavaScript 中所有对象的父对象 ...
- vue 带参数的跳转-完成一个功能之后 之后需要深思,否则还会忘记
我要写详细点,否则下次很容易忘记 写了一个页面,这个页面里面添加了 很多a 标签,跳转都是同一个页面,内容不一样,方法 首先 路由 设定好 routes:[ { path:'/aaa', name:' ...
- springboot连接redis错误 io.lettuce.core.RedisCommandTimeoutException:
springboot连接redis报错 超时连接不上 可以从以下方面排查 1查看自己的配置文件信息,把超时时间不要设置0毫秒 设置5000毫秒 2redis服务长时间不连接就会休眠,也会连接不上 重 ...
- AppBoxFuture实战: 如何同步开发与生产环境的模型
框架是用抽象模型驱动的方式来生成应用系统的,这样可以将这些模型序列化为相应的模型包文件,通过反序列化导入至其他部署环境内,从而实现开发环境与生产环境的同步,包括对应的数据库结构的同步.下面通过示例 ...