有标号为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(并查集+深度的意义相关推荐

  1. hdu-3635 Dragon Balls(并查集)

    题意: 初始化每个城市都有一个龙珠 进行两步操作 T  A  B 就是把A所在的城市的龙珠数都运到城市B中 Q  A   即要输出 A所在的城市 . A所在城市的个数.A移动的次数 本题貌似不需要把原 ...

  2. hdu 3635 Dragon Balls 并查集应用记录每个点的转移次数

    题意: 有n个龙珠,分别存放在编号为1-n的城市里面.然后进行如下操作,T,a,b将a龙珠所在城市的所有龙珠都转移到b龙珠所在的城市,Q,a输出a龙珠所在的城市,以及该城市一共有多少个龙珠,同时输出该 ...

  3. AGC012D - Colorful Balls(并查集)

    AGC012D - Colorful Balls Solution 连边题. 找出www最小的球yyy和www最小且颜色和yyy不同的球zzz. yyy向所有colt≠coly,wt+wy≤Ycol ...

  4. [NOI2018] 归程 可持久化并查集

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...

  5. hdu 3635 Dragon Balls 龙珠 带权并查集

    每次移动都是一个群龙珠移动到另一群龙珠所在的城市里面.所以这两个城市之间都不会空. 用并查集表示,每一个祖先节点的序号和他们所在城市的序号相同. 无论路径如何压缩,子结点的移动次数=父节点的移动次数+ ...

  6. hdu3635 Dragon Balls(带权并查集)

    /* 题意:有N个城市, 每一个城市都有一个龙珠(编号与城市的编号相同),有两个操作 T A ,B 将标号为A龙珠所在城市的所有的龙珠移动到B龙珠所在城市中!  思路:并查集 (压缩路径的时候将龙珠移 ...

  7. hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)

    这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...

  8. PAT甲级1021 Deepest Root :[C++题解]树的最大深度、并查集、dfs求树的深度

    文章目录 题目分析 题目链接 题目分析 分析: 考察知识点:并查集.dfs.树的深度 给定n个结点,n-1条边,只要能保证只有1个连通分量,就是一棵树.否则的话就不是树,它是不连通的. 用并查集来看是 ...

  9. 并查集入门+初级专题训练

    介绍   摘自罗勇军,郭卫斌的<算法竞赛入门到进阶>上的说明:   并查集(Disjoint Set)是一种非常精巧而且食用的数据结构,它主要用于处理一些不相交集合的合并问题.经典的例子有 ...

最新文章

  1. python如何定义类_Python 面向对象
  2. UNL(Ubiquitous Navigation Lab)
  3. jieba(结巴)常用方法
  4. asp.net 路径(转)
  5. LSI系新军搅局,PCIe固态盘混战?
  6. mysql服务器程序_MySQL服务器
  7. 用 cairo 实现跨平台图形
  8. JDK/Java SE官方文档汇总
  9. Ng第一课:引言(Introduction)
  10. 《数学计算出题系统》功能规格说明书
  11. LNK2026 module unsafe for SAFESEH image
  12. 字符串转数组和数组转字符串
  13. 《电路》邱关源 思维导图 第七章-一阶和二阶电路的时域分析
  14. Bootstrap基础九辅助类
  15. 下载知乎等网站视频小技巧
  16. ps在当前的图片添加一张图片进来
  17. 基于PaddleX的化妆品识别
  18. 计算机论文中的技术路线,论文中的技术路线图怎么写
  19. matplotlib的cmap
  20. 北京医保可报销的定点医院

热门文章

  1. Mac上时钟也能自定义的方法你知道吗
  2. P2241 统计方形(数据加强版)-- 70分 python3实现
  3. 1.10 编程基础之简单排序 03 成绩排序 3分 python
  4. 微信开发h5支付功能,配置单价和商品信息无法更新问题解决方法!
  5. 基于Java聊天系统设计(含源文件)
  6. Redis工作笔记-Set类型
  7. Qt工作笔记-对*QObject::sender()的认识
  8. Qt工作笔记-绘制静态折线图
  9. C++ STL deque创建
  10. Apache HttpComponents在App里访问HTTP服务