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>


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。