热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UVA11987:并查集支持删除操作的实现与应用

在处理UVA11987问题时,关键在于实现并查集结构以支持删除操作。特别地,当需要删除某个节点时,如果该节点不是根节点,则处理相对简单;然而,若删除的是根节点,则需要进行额外的处理来维护集合的连通性。本文将详细介绍如何通过优化并查集算法,确保在删除根节点时仍能高效地维护数据结构的完整性和查询效率。

Almost Union-Find

 UVA - 11987 

这题的重点在于一些点会被删除,但是我们知道,如果不是根节点的还好,一旦删除根节点,该并查集的结构就被严重破坏了,因此我们选择设置一个虚点,他不存在,也不贡献点的数量,也不贡献值,仅仅是存在于那里为我们来维持结构。

为了达到这个目的,我们为每个点设定一个id值每当这个点经历了一次删除操作,我们就为他更换一个新的ip。再检索时就用这个新的ID进行检索,而旧的ID就放在那里储存和维持原来的结构。特别需要注意的是,我们总是通过点来确定,我们到底是要搜索哪个id而在后续的搜索和合并都使用id值来进行合并。即信息的储存仅与id有关,而id与点有关,但点与信息无关。

具体细节见代码:

#include
#include
#define int long long
using namespace std;
const int size=1e6+5;
int tot;
int fa[size],id[size],cnt[size],sum[size];
void init(int n)
{tot&#61;n&#43;1;for(int i&#61;1;i<&#61;n;i&#43;&#43;){cnt[i]&#61;1;sum[i]&#61;i;fa[i]&#61;i;id[i]&#61;i;}
}
int find(int x)
{return x&#61;&#61;fa[x]?x:fa[x]&#61;find(fa[x]);
}
void merge(int x,int y)
{int fx&#61;find(id[x]),fy&#61;find(id[y]);if(fx&#61;&#61;fy) return;cnt[fy]&#43;&#61;cnt[fx];sum[fy]&#43;&#61;sum[fx];cnt[fx]&#61;0,sum[fx]&#61;0;fa[fx]&#61;fy;
}
void move(int x,int y)
{int fx&#61;find(id[x]),fy&#61;find(id[y]);id[x]&#61;&#43;&#43;tot;fa[tot]&#61;fy;sum[fy]&#43;&#61;x;cnt[fy]&#43;&#43;;sum[fx]-&#61;x;cnt[fx]--;
}
int32_t main()
{int n,k;while(~scanf("%lld%lld",&n,&k)){init(n);while(k--){int op;scanf("%lld",&op);if(op&#61;&#61;1){int a,b;scanf("%lld%lld",&a,&b);merge(a,b);}if(op&#61;&#61;2){int a,b;scanf("%lld%lld",&a,&b);move(a,b);}if(op&#61;&#61;3){int x;scanf("%lld",&x);int fx&#61;find(id[x]);cout<}

 

转:https://www.cnblogs.com/fly-white/p/10092760.html



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
author-avatar
花落---守护者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有