HDU 3635 并查集+路径压缩+记录每个点移动次数
2013-11-19 22:10
357 查看
题意:
给定n个点 oper个操作
每个点有1个龙珠
下面2种操作:
T u v 把u点所有龙珠搬到v
Q u 问u点当前所在城市 u点所在城市有几个龙珠 u点被移动几次
思路:
并查集可以求出 u 点所在城市,记录每个点的 son(子节点数)可以求出 某城市的龙珠数量
用step 记录每个点被移动了几次
给定n个点 oper个操作
每个点有1个龙珠
下面2种操作:
T u v 把u点所有龙珠搬到v
Q u 问u点当前所在城市 u点所在城市有几个龙珠 u点被移动几次
思路:
并查集可以求出 u 点所在城市,记录每个点的 son(子节点数)可以求出 某城市的龙珠数量
用step 记录每个点被移动了几次
#include<stdio.h> #include<string.h> inline int Max(int a,int b){return a>b?a:b;} #define N 100001 struct node{ int step, parent, son; }a ; char s[2]; int find(int x){ if(x==a[x].parent)return x; int temp = a[x].parent; a[x].parent = find(a[x].parent); a[x].step += a[temp].step; return a[x].parent; } void Union(int x, int y){ int fx = find(x), fy = find(y); if(fx == fy)return; a[fx].parent = fy; a[fx].step ++; a[fy].son += a[fx].son; a[fx].son = 0; } int main(){ int T, Cas = 1, n, oper, i, j, u, v; scanf("%d",&T); while(T--){ scanf("%d %d",&n,&oper); printf("Case %d:\n", Cas++); for(i = 1; i<= n; i++) { a[i].son = 1; a[i].parent = i; a[i].step = 0; } while(oper--){ scanf("%s",s); if(s[0] == 'T') { scanf("%d %d",&u,&v); Union(u, v); } else { scanf("%d",&u); int ans = find(u); printf("%d %d %d\n",ans, a[ ans ].son, a[u].step); } } } return 0; }
相关文章推荐
- HDU 3635 并查集+路径压缩+记录每个点移动次数
- hdu 3635 Dragon Balls 并查集应用记录每个点的转移次数
- [HDU 3635]Dragon Balls[并查集][路径压缩]
- hdu 3635 Dragon Balls (并查集,路径压缩应用)
- hdu 3635 Dragon Balls (并查集,路径压缩应用)
- HDU-3635 Dragon Balls 并查集路径压缩
- HDU 3635 Dragon Balls(并查集路径压缩)
- HDU 3635 Dragon Balls(并查集:路径压缩)
- hdu1074 状态压缩dp 记录路径
- 杭电3635————并查集的应用(路径压缩)
- hdu1074 状态压缩dp 记录路径
- hdu 1213 How Many Tables 并查集模板题+路径压缩
- 杭电3635-Dragon Balls-并查集之路径压缩
- hdu1074 状态压缩dp 记录路径
- hdu1074 状态压缩dp 记录路径
- 卡路径压缩的并查集题目-hdu 1856
- hdu 1232 借助这题学习了下并查集的路径压缩
- (hdu step 5.1.5)Dragon Balls(求并查集的根节点、节点数和个结点的移动次数)
- hdu 2818 Building Block 并查集 路径压缩
- hdu1074 状态压缩dp 记录路径