题目大意:
有N个节点,初始时没有根节点,每次进行I或者E操作。
E u : 算出u到根节点的距离
I u v : 将v作为u的根节点,之间距离为 abs(u-v)%1000;
思路:
因为加权的并查集接触的不多。所有拿到题之后并查集的思想只存在大脑1s,就开是dfs找路径。因为终止条件看做了数字0,提交一直WA,没有超时,以为方法正确(TAT),直接WA到比赛结束。
加权并查集的裸题。维护距离数组d。
附上AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 20000 + 5;
int par[maxn];
int d[maxn];
int T,n;
char c;
int u, v;
void init() {
for(int i = 0; i < maxn; i++){
par[i] = i;
d[i] = 0;
}
}
int find(int x){
if(par[x] == x)return x;
int f = find(par[x]);
d[x] += d[par[x] ];
return par[x] = f;
}
int main(){
ios :: sync_with_stdio(false);
cin >> T;
while(T--) {
init();
cin >> n;
while(cin >> c) {
if(c == 'O') break;
else if(c == 'I') {
cin >> u >> v;
par[u] = v;
d[u] = abs(u - v) % 1000;
}
else if(c == 'E') {
cin >> u;
find(u);
cout << d[u] << endl;
}
}
}
return 0;
}