UVA - 1329 Corporative Network 合作网络(并查集)

来源:互联网 发布:mysql employees表 编辑:程序博客网 时间:2024/05/16 06:53

大体题意:

有n 个结点,初始时每个结点的父节点都不存在。你的任务是执行一次I操作和E操作,格式如下:

I u,v 把结点u 的父节点设置为v,距离为|u-v|%1000  保证u没有父节点。

E u,询问u到根节点的距离!

思路:

并查集:

用d[u]表示u结点到根节点的距离。

每次E操作都初始化父节点和  距离!

每次I操作 都要查一下父节点,find,在find过程中更新d数组!

大体过程就是在递归返回的过程中更新d   d[x] += d[pa[x]]  !仔细想想这样正好全部加回去!!

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 200000 + 10;int fa[maxn];int d[maxn];int find(int u){    if (fa[u] == u)return u;    int root = find(fa[u]);    d[u] += d[fa[u]];    return fa[u] = root;}int main(){    int T;    scanf("%d",&T);    char cmd[20];    while(T--){        int n;        memset(d,0,sizeof d);        scanf("%d",&n);        for (int i = 0; i <= n; ++i)fa[i] = i;        while(scanf("%s",cmd) == 1 && cmd[0] != 'O'){            if (cmd[0] == 'E'){                int u;                scanf("%d",&u);                find(u);                printf("%d\n",d[u]);                continue;            }            int u,v;            scanf("%d %d",&u,&v);            fa[u] = v;            d[u] = abs(u-v)%1000;        }    }    return 0;}


0 0
原创粉丝点击