时间限制:3.000秒
加权并查集,在查根节点的基础之上加上了到根节点的距离,只需要另开一个数组d保存距离,然后在路径压缩时维护数组即可。
#include
#include
int p[20010], d[20010];
int findp(const int &x) {
if(p[x] == x) return x;
else {
int pa = findp(p[x]);
d[x] += d[p[x]];
return p[x] = pa;
}
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, u, v; char cmd[100];
scanf("%d", &n);
for(int i = 0; i <= n; ++i) p[i] = i, d[i] = 0;
while(~scanf("%s", cmd) && cmd[0] != 'O') {
if(cmd[0] == 'I') {
scanf("%d%d", &u, &v);
p[u] = v;
d[u] = abs(u - v) % 1000;
} else {
scanf("%d", &u);
findp(u);
printf("%d\n", d[u]);
}
}
}
return 0;
}

本文介绍了一种加权并查集的数据结构实现方法,该方法不仅能够查找根节点,还能计算节点到根节点的距离。通过维护一个额外的距离数组并在路径压缩过程中更新此数组来实现这一功能。
456

被折叠的 条评论
为什么被折叠?



