并查集uva1329(LA3027)

来源:互联网 发布:电视剧大全软件下载 编辑:程序博客网 时间:2024/06/04 20:17

思路:查询的时候,维护一个距离数组,保存每次改变父节点后,每个节点到根节点的距离。

#include<iostream>#include<cstdio>using namespace std;const int maxn=20010;int n,pra[maxn],rank[maxn],dis[maxn],head[maxn];void init(){    for(int i=0;i<=n;i++)    {        pra[i]=i;        rank[i]=0;        dis[i]=0;    }}int Abs(int x){    return x>=0?x:(-x);}int find(int u){    if(pra[u]==u){dis[u]=0;return u;}    int v=pra[u];    pra[u]=find(pra[u]);    dis[u]+=dis[v];    return pra[u];}void unite(int a,int b){    pra[a]=b;}int main(){    int t,u,v;    char x;    cin>>t;    while(t--)    {        cin>>n;        init();        while(cin>>x,x!='O')        {            if(x=='I'){cin>>u>>v;unite(u,v);head[u]=v;dis[u]=Abs(u-v)%1000;}            else if(x=='E')            {                cin>>u;                if(pra[pra[u]]!=pra[u])                    find(u);                cout<<dis[u]<<endl;            }        }    }    return 0;}


0 0