题意:

第一行给出一个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 并查集的节点删除的更多相关文章

  1. <算法><Union Find并查集>

    Intro 想象这样的应用场景:给定一些点,随着程序输入,不断地添加点之间的连通关系(边),整个图的连通关系也在变化.这时候我们如何维护整个图的连通性(即判断任意两个点之间的连通性)呢? 一个比较简单 ...

  2. 并查集(Union/Find)模板及详解

    概念: 并查集是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的Kruskal 算法和求最近公共祖先等. 操作: 并查集的基本操作有两个 ...

  3. 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 ...

  4. 并查集(Union Find)的基本实现

    概念 并查集是一种树形的数据结构,用来处理一些不交集的合并及查询问题.主要有两个操作: find:确定元素属于哪一个子集. union:将两个子集合并成同一个集合. 所以并查集能够解决网络中节点的连通 ...

  5. 并查集 (Union Find ) P - The Suspects

    Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...

  6. 并查集(Disjoint Set Union,DSU)

    定义: 并查集是一种用来管理元素分组情况的数据结构. 作用: 查询元素a和元素b是否属于同一组 合并元素a和元素b所在的组 优化方法: 1.路径压缩 2.添加高度属性 拓展延伸: 分组并查集 带权并查 ...

  7. 第三十一篇 玩转数据结构——并查集(Union Find)

    1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现   2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两 ...

  8. 并查集(不相交集)的Union操作

    在并查集(不相交集)中附加操作\(Deunion\),它实现的功能是取消最后一次\(Union\)的操作. 实现思想 初始化一个空栈,将每一次的\(Union\)操作的两个集合的根和其值\(Push\ ...

  9. Mutual Training for Wannafly Union #6 E - Summer Trip(并查集)

    题目链接:http://www.spoj.com/problems/IAPCR2F/en/ 题目大意: 给m个数字代表的大小,之后n组数据,两两关联,关联后的所有数字为一组,从小到大输出组数以及对应的 ...

随机推荐

  1. C++扬帆远航——11(斐波那契数列)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:Feibo.cpp * 作者:常轩 * 微信公众号:Worldh ...

  2. MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL逻辑架构 1.逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系. 很经典的C/S架构风格, ...

  3. 放弃了程序员互联网高薪,跑去事业单位做IT的尴尬

    “你是程序员对吧?”“是啊,怎么了?”“那你帮我修一下电脑吧.”我原来也是一个重点大学毕业,基本上事业里面搞IT就干这些事情,要是以前,我肯定会想,我是程序员和修电脑有啥关系. 但是自从进了事业单位, ...

  4. blender 2.8 [学习笔记-04] 编辑模式-网格拆分

    在编辑模式下

  5. 关于org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.atguigu.crud.dao.DepartmentMapper.insertSelective的错误

    今天我在使用mybatis逆向工程的时候,由于一个疏忽字打错了..结果花了一早上才把错误找全..广大小伙伴们一定要小心啊(能复制粘贴就别手打) 关于org.apache.ibatis.binding. ...

  6. 从0系统学Android--5.2 发送广播

    从0系统学Android--52 发送广播 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 5.3 发送自定义广播 前面已经学习了如何接受广播了 ...

  7. ios background task

    今天要实现一个需求,当用户触摸HOME键,将应用切换到后台时,启动自动备份的任务.这涉及到ios的后台任务处理,本文简单总结一下 首先,ios app有5种状态,分别是:not running, in ...

  8. python使用for循环打印9*9乘法表。

    代码如下: for a in range(1, 10): for b in range(1, 10): if b <= a: print("%d*%d=%d\t" % (b, ...

  9. PHP的魔术常量(常用八大常量)

    PHP的魔术常量都是由不同的扩展库定义的,只有在加载了这些扩展时才会出现,或者动态加载后 有八个魔术常量他们的值随着他们在代码中的位置改变而改变. __LINE__  文件中的当前行号. 实列: &l ...

  10. JAVA生成EXCEL模板

    JAVA生成excel模板,支持1.必填字段前加 红色 * 2.定义可选值下拉列表 valList3.定义名称并通过名称设置可选值 refName(名称在sheet2,sheet2自动隐藏)4.支持设 ...