题意:有n个节点,有两个操作,I x y:把x作为y的子节点连上,他们的距离为abs(x-y)%1000;E x:查询x到根节点的距离。
思路:加权并查集,其实这题就是在普通并查集的基础上增加一个数组d[x], 记录X到根节点的距离。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 20000 + 10;
int pa[maxn], d[maxn];
int findset( int x ) {
if (pa[x] != x) {
int root = findset( pa[x] );
d[x] += d[pa[x]];
return pa[x] = root;
} else return x;
}
int main() {
int T;
cin >> T;
while(T--) {
int n, u, v;
string cmd;
cin >> n;
for(int i = 1; i <= n; i++) { pa[i] = i; d[i] = 0; }
while(cin >> cmd && cmd[0] != 'O') {
if(cmd[0] == 'E') { cin >> u; findset(u); cout << d[u] << endl; }
if(cmd[0] == 'I') { cin >> u >> v; pa[u] = v; d[u] = abs(u-v) % 1000; }
}
}
return 0;
}