传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33982
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
const int MAXN = 200005;
int bin[MAXN];
int path[MAXN];
int findx(int x) {
if(x != bin[x]) {
int root = findx(bin[x]);
path[x] += path[bin[x]];
bin[x] = root;
}
return bin[x];
}
void Deal_with() {
int T,n;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i = 0 ; i <= n ; i++) {
bin[i] = i;
path[i] = 0;
}
char tempc[10];
int u,v;
while(scanf("%s",tempc) && tempc[0] != 'O') {
if(tempc[0] == 'I') {
scanf("%d %d",&u,&v);
bin[u] = v;
path[u] += abs(u - v) % 1000;
}
else {
scanf("%d",&u);
findx(u);
printf("%d\n",path[u]);
}
}
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}
本文通过一个具体的程序实例,深入浅出地介绍了并查集在解决路径查找与更新问题中的应用。通过对源代码的逐行解析,展示了如何利用并查集进行节点连接以及路径长度的维护,特别适用于算法竞赛中涉及连通性和距离计算的问题。
456

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



