您的位置:首页 > 其它

UVA - 1329 Corporative Network(加权并查集)

2017-08-18 15:19 232 查看
点击打开题目链接

题目大意:

有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva 加权并查集