poj 1962 Corporative Network

主题链接:http://poj.org/problem?id=1962

思路:每一个集合中用根节点标记这个集合,每一个点到根节点的距离。

code:

<span style="font-size:18px;">#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<set>

using namespace std;

const int maxn=20005;

int pa[maxn],d[maxn];

int findset(int x)   //找出x节点到根节点的距离
{
    if(pa[x]!=x)           
    {
        int root=findset(pa[x]);
        d[x]+=d[pa[x]];       //更新x节点的距离
        return pa[x]=root;
    }
    else return x;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        char str[10];
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            pa[i]=i;
            d[i]=0;
        }
        while(scanf("%s",str))
        {
            if(str[0]=='O') break;
            if(str[0]=='E')
            {
                int x;
                scanf("%d",&x);
                findset(x);
                printf("%d\n",d[x]);
            }
            if(str[0]=='I')
            {
                int x,y;
                scanf("%d%d",&x,&y);
                pa[x]=y;
                d[x]=abs(x-y)%1000;
            }
        }
    }
    return 0;
}
</span>


版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-10-12 15:12  zfyouxi  阅读(134)  评论(0编辑  收藏  举报