思路:并查集。
注意:只能将i挂在j上,不能写成了把i挂在j的根节点上。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
int n;
int fa[20005];
int d[20005];
int find(int x) {
if(fa[x]==-1) return x;
int y=fa[x];
fa[x]=find(fa[x]);
d[x]+=d[y];
return fa[x];
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
memset(fa,-1,sizeof(fa));
memset(d,0,sizeof(d));
scanf("%d",&n);
char opr;
while(true) {
while(~scanf("%c",&opr)&&!isalpha(opr));
if(opr=='O') break;
else if(opr=='I') {
int x,y,z;
scanf("%d%d",&x,&y);
z=abs(x-y)%1000;
fa[x]=y;
d[x]=z;
} else {
int x;
scanf("%d",&x);
find(x);
printf("%d\n",d[x]);
}
}
}
return 0;
}
本文介绍了一个使用并查集解决的企业网络连接问题。通过维护员工间的直接连接关系及距离,实现快速查找任意员工与指定上级之间的距离。具体实现包括了如何构建并查集、查询路径压缩以及路径距离更新等关键步骤。
457

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



