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组数据,两两关联,关联后的所有数字为一组,从小到大输出组数以及对应的 ...
随机推荐
- LeetCode--二叉树2--运用递归解决树的问题
LeetCode--二叉树2--运用递归解决树的问题 在前面的章节中,我们已经介绍了如何利用递归求解树的遍历. 递归是解决树的相关问题最有效和最常用的方法之一. 我们知道,树可以以递归的方式定义为一个 ...
- ASP.NET CORE 内置的IOC解读及使用
在我接触IOC和DI 概念的时候是在2016年有幸倒腾Java的时候第一次接触,当时对这两个概念很是模糊:后来由于各种原因又回到.net 大本营,又再次接触了IOC和DI,也算终于搞清楚了IOC和DI ...
- SpringBoot开始多线程
增加配置类 package com.springbootdemo.demo.config; import org.springframework.context.annotation.Bean; im ...
- PyCharm使用技巧及常用快捷键
Ctrl + Shift + F--------------------------------------------->>>>>>>高级查找 Ctrl + ...
- vue中的自定义分页插件组件
介绍一下,已经有很多的vue分页的组件了,大家都是大同小易,那么我就结合自身的使用,写出了一片文章 首先在新建一个分页模块 在模块中引入相应的代码,(内有详细的注释) template中 <di ...
- uWSGI, send_file and Python 3.5
当你的Flask项目通过Nginx+uWSGI成功部署的时候,当你很高兴你Flask里面的接口成功跑通的时候,你会发现真高兴!好牛逼! 然后当你写了其他几个接口的时候,在启动uWSGI服务的时候,死活 ...
- Service Mesh - gRPC 本地联调远程服务
Description Service Mesh 架构下,服务间调用会通过服务名(Service Name)互相调用,比如在 Kubernetes .Docker Swarm 集群中,服务 IP 均由 ...
- Yuchuan_Linux_C编程之六 Makefile项目管理
一.整体大纲 二.makefile的编写 一个规则 两个函数 三个变量 1. 一个规则 三要素:目标, 依赖, 命令 目标:依赖 命令: 第一条规则是用来生成终 ...
- C#桌面开发的未来-WebWindow
WebWindow源码作者博客基于Chromium的Edge体验体验方式一:体验方式二:预期目标:遗留的问题 WebWindow WebWindow是跨平台的库. Web Window的当前实验实现可 ...
- 使用.Net Core编写命令行工具(CLI)
命令行工具(CLI) 命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. 通常认为,命令行工具(CLI)没有 ...