题目: UVALive - 3027Corporative Network(带权并查集)
题目大意:有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; }