POJ1988 带权并查集
来源:互联网 发布:js 转化成数字类型 编辑:程序博客网 时间:2024/06/04 18:02
题意:
若干个个方块,2种操作:
M 将u所在的方块堆整体移动到v所在的方块堆;
C 询问u方块下面有多少块方块。
做法:带权并查集
1) 对于每个根节点,拥有属性SetSize【root】 , 即此集合的大小;
2)对于每个节点,拥有属性distanceToRoot【u】 ,即此节点 距离所在集合 根节点的距离, 根节点离自己距离为0
3)在压缩路径,递归操作时,维护的是distanceToRoot 值;
4)在合并操作时, 维护的是SetSize【fromRoot】 与 distanceToRoot【toRoot】
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new POJ1988().solve();}}class POJ1988 {InputReader in = new InputReader(System.in);PrintWriter out = new PrintWriter(System.out);final int N = 30008 ;int[] father = new int[N] ;int[] distanceToRoot = new int[N] ;int[] setSize = new int[N] ;void init(){for(int i = 1 ; i < N ; i++){father[i] = i ;setSize[i] = 1 ;distanceToRoot[i] = 0 ; }}int getRoot(int u){if(u == father[u]) return u ;int root = getRoot(father[u]) ;distanceToRoot[u] += distanceToRoot[father[u]] ;return father[u] = root ;}void move(int from , int to){int rootFrom = getRoot(from) ;int rootTo = getRoot(to) ;if(rootFrom != rootTo){father[rootTo] = rootFrom ;distanceToRoot[rootTo] += setSize[rootFrom] ;setSize[rootFrom] += setSize[rootTo] ;}}void solve() {init() ;int n = in.nextInt() ; while(n-- > 0){if("C".equals(in.next())){int u = in.nextInt() ;int root = getRoot(u) ; out.println(setSize[root] - distanceToRoot[u] - 1) ;}else{move(in.nextInt() , in.nextInt()) ;}}out.flush() ;}}class InputReader {public BufferedReader reader;public StringTokenizer tokenizer;public InputReader(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = new StringTokenizer("");}private void eat(String s) {tokenizer = new StringTokenizer(s);}public String nextLine() {try {return reader.readLine();} catch (Exception e) {return null;}}public boolean hasNext() {while (!tokenizer.hasMoreTokens()) {String s = nextLine();if (s == null)return false;eat(s);}return true;}public String next() {hasNext();return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}
0 0
- poj1988&&hdu2818 带权并查集
- poj1988带权并查集
- 带权并查集 POJ1988 POJ2492
- 【带权并查集】POJ1988
- POJ1988 带权并查集
- POJ1988带权并查集
- poj1988 带权并查集
- POJ1988-Cube Stacking(带权并查集)
- POJ1988 Cube Stacking 带权并查集
- POJ1988(带权并查集,搬砖块)
- POJ1988-Cube Stacking(带权并查集)
- HDU 2818 && POJ1988 带权并查集
- 并查集(POJ1988)
- POJ1988->并查集
- POJ1988并查集
- poj1988 权值并查集
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
- POJ1988(并查集)
- 第13章
- HDU2602-Bone Collector
- 如何排序DataTable中的int型数据
- 【计算机视觉】<前景检测>背景建模数学理论
- 动态规划:如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
- POJ1988 带权并查集
- iOS 关于在UITableView中,实现多个cell中不同的倒计时实现
- hibernate的Sessionfactory.getCurrentSession详解和在项目中常用方法
- LeetCode_8
- linux(centos)下SVN服务器如何搭建
- Matlab 矩阵
- 用glew,glfw,FreeImage实现opengl学习笔记6坐标变换
- poj safecracker1248
- MYSQL 命令行大全 (简洁、明了、全面)