UVALive - 3027Corporative Network(带权并查集)
2014-09-09 10:32
435 查看
题目: UVALive - 3027Corporative Network(带权并查集)
题目大意:有n和节点,初始时每个节点的父节点都不存在,然后有下面两种操作:I 操作 I a,b 将a的父节点变成b。E操作 E a,查询a到它的父节点的距离。
解题思路:带权并查集。注意这里距离的变化是a -> b,那么a到根节点的距离就是a到b的距离的绝对值 % 1000 + b到它的根节点的距离。
代码:
题目大意:有n和节点,初始时每个节点的父节点都不存在,然后有下面两种操作:I 操作 I a,b 将a的父节点变成b。E操作 E a,查询a到它的父节点的距离。
解题思路:带权并查集。注意这里距离的变化是a -> b,那么a到根节点的距离就是a到b的距离的绝对值 % 1000 + b到它的根节点的距离。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 2e5 + 5; int p[maxn], c[maxn]; int n; void init () { for (int i = 1; i <= n; i++) { p[i] = i; c[i] = 0; } } int getParent (int a) { if (a == p[a]) return a; int t = p[a]; p[a] = getParent (p[a]); c[a] += c[t]; return p[a]; } int main () { int T; int a, b; char str[10]; scanf ("%d", &T); while (T--) { scanf ("%d", &n); init(); while (scanf ("%s", str) != EOF) { if (str[0] == 'O') break; if (str[0] == 'E') { scanf ("%d", &a); int q1 = getParent (a); printf ("%d\n", c[a]); } else { scanf ("%d%d", &a, &b); p[a] = b; c[a] = abs (a - b) % 1000; } } } return 0; }
相关文章推荐
- UVALive - 3644X-Plosives(并查集)
- UVALive3027 并查集
- (组队赛E/F Number of Connected Components )UVALive - 7638 (并查集)
- UVALive 6910 Cutting Tree 并查集
- UVALive 6187 Never Wait for Weights 带权并查集
- 带权值并查集(Uvalive 3027)
- UVALive - 3027 - Corporative Network (并查集!!)
- UVALive - 3644 X-Plosives 并查集
- UVALive - 3644 X-Plosives 并查集
- uvalive 3027(并查集)
- UVALIVE 4487 Exclusive-OR(加权并查集)
- 【并查集】【枚举倍数】UVALive - 7638 - Number of Connected Components
- UVALive 6091 Trees 并查集(水
- UVALive 6910 Cutting Tree(离线逆序并查集)
- UVALive 3027 Corporative Network 带权并查集
- 指南 第三章 例题6 UVALive 3027 Corporative Network(并查集的应用)
- uvalive 3644 X-Plosives(并查集)
- 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network
- UVALive - 6910 (离线逆序并查集)
- UVALive_6168_Fat Ninjas(二分+并查集)