UVA

来源:互联网 发布:维护数据库培训班 编辑:程序博客网 时间:2024/06/10 10:42

点击打开题目链接

题目大意:

有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;}

原创粉丝点击