N - Dragon Balls(并查集+深度的意义
有标号为1到n的n个龙珠,分别放在对应标号为1到n的n个城市里。 下面有两种操作: T A B表示把A龙珠所在城市的所有龙珠都转移到B龙珠所在的城市中 Q A 表示查询A,需要知道A龙珠现在所在的城市,A所在的城市有几颗龙珠,A转移到这个城市移动了多少次,分别输出3个整数,表示上述信息。
前两个用普通并查集就能算出来,移动次数不好维护;
如果我们不进行路径压缩,那么查询点的深度即是移动的次数,因为每移动一次父节点就下降一层,深度+1;
但不路径压缩的话就会超时,所以我们要把点的深度记录下来;;
#include <cstdio> #include <algorithm> #include <iostream>using namespace std; int ans[100000] ,ansn[100000] ,pre[100000];void init( int x){for( int i = 0 ; i<=x ;i++){pre[i] = i;ans[i] = 0;ansn[i] = 1;} }int find( int a){/* int r=a; //刚开始这样记录深度ans[a],但是这样不对,这样只是路径压缩一次ans[n]++,但实际上一次可能压缩很多层,所以应该是加上上一层的压缩层数while( pre[a]!=a){a=pre[a];}int t;while( pre[r]!=a){ans[r]++;t= pre[r];pre[r] =a;r=t;}*/if( a == pre[a] )return a;else{int tmp= pre[a];pre[a] = find( pre[a]);ans[a] += ans[tmp];}return pre[a]; }int add( int a ,int b){int x=find(a);int y=find(b);if( x != y){pre[x] = y;ans[x] = 1;ansn[y] += ansn[x];ansn[x] =0;} }int main( ){int ks=0, T;scanf("%d",&T);while( T--){printf("Case %d:\n",++ks);int n,m;scanf("%d%d" ,&n ,&m);init( n);while( m--){char op[10];int a,b;scanf("%s",op);if( op[0] == 'T'){scanf("%d%d" ,&a,&b);add( a,b);}if( op[0] == 'Q'){scanf("%d" ,&a);int b=find(a);printf("%d %d %d\n" ,b ,ansn[b] ,ans[a]);}}}return 0; }
转载于:https://www.cnblogs.com/-ifrush/p/10661574.html
N - Dragon Balls(并查集+深度的意义相关推荐
- hdu-3635 Dragon Balls(并查集)
题意: 初始化每个城市都有一个龙珠 进行两步操作 T A B 就是把A所在的城市的龙珠数都运到城市B中 Q A 即要输出 A所在的城市 . A所在城市的个数.A移动的次数 本题貌似不需要把原 ...
- hdu 3635 Dragon Balls 并查集应用记录每个点的转移次数
题意: 有n个龙珠,分别存放在编号为1-n的城市里面.然后进行如下操作,T,a,b将a龙珠所在城市的所有龙珠都转移到b龙珠所在的城市,Q,a输出a龙珠所在的城市,以及该城市一共有多少个龙珠,同时输出该 ...
- AGC012D - Colorful Balls(并查集)
AGC012D - Colorful Balls Solution 连边题. 找出www最小的球yyy和www最小且颜色和yyy不同的球zzz. yyy向所有colt≠coly,wt+wy≤Ycol ...
- [NOI2018] 归程 可持久化并查集
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...
- hdu 3635 Dragon Balls 龙珠 带权并查集
每次移动都是一个群龙珠移动到另一群龙珠所在的城市里面.所以这两个城市之间都不会空. 用并查集表示,每一个祖先节点的序号和他们所在城市的序号相同. 无论路径如何压缩,子结点的移动次数=父节点的移动次数+ ...
- hdu3635 Dragon Balls(带权并查集)
/* 题意:有N个城市, 每一个城市都有一个龙珠(编号与城市的编号相同),有两个操作 T A ,B 将标号为A龙珠所在城市的所有的龙珠移动到B龙珠所在城市中! 思路:并查集 (压缩路径的时候将龙珠移 ...
- hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)
这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...
- PAT甲级1021 Deepest Root :[C++题解]树的最大深度、并查集、dfs求树的深度
文章目录 题目分析 题目链接 题目分析 分析: 考察知识点:并查集.dfs.树的深度 给定n个结点,n-1条边,只要能保证只有1个连通分量,就是一棵树.否则的话就不是树,它是不连通的. 用并查集来看是 ...
- 并查集入门+初级专题训练
介绍 摘自罗勇军,郭卫斌的<算法竞赛入门到进阶>上的说明: 并查集(Disjoint Set)是一种非常精巧而且食用的数据结构,它主要用于处理一些不相交集合的合并问题.经典的例子有 ...
最新文章
- python如何定义类_Python 面向对象
- UNL(Ubiquitous Navigation Lab)
- jieba(结巴)常用方法
- asp.net 路径(转)
- LSI系新军搅局,PCIe固态盘混战?
- mysql服务器程序_MySQL服务器
- 用 cairo 实现跨平台图形
- JDK/Java SE官方文档汇总
- Ng第一课:引言(Introduction)
- 《数学计算出题系统》功能规格说明书
- LNK2026	module unsafe for SAFESEH image
- 字符串转数组和数组转字符串
- 《电路》邱关源 思维导图 第七章-一阶和二阶电路的时域分析
- Bootstrap基础九辅助类
- 下载知乎等网站视频小技巧
- ps在当前的图片添加一张图片进来
- 基于PaddleX的化妆品识别
- 计算机论文中的技术路线,论文中的技术路线图怎么写
- matplotlib的cmap
- 北京医保可报销的定点医院
热门文章
- Mac上时钟也能自定义的方法你知道吗
- P2241 统计方形(数据加强版)-- 70分 python3实现
- 1.10 编程基础之简单排序 03 成绩排序 3分 python
- 微信开发h5支付功能,配置单价和商品信息无法更新问题解决方法!
- 基于Java聊天系统设计(含源文件)
- Redis工作笔记-Set类型
- Qt工作笔记-对*QObject::sender()的认识
- Qt工作笔记-绘制静态折线图
- C++ STL deque创建
- Apache HttpComponents在App里访问HTTP服务