并查集LA3027

来源:互联网 发布:p2p网络借贷监管政策 编辑:程序博客网 时间:2024/06/05 03:18

基本题,每次把一个根加到另一棵树的结点上,距离有定义,每次询问某结点到根的距离。

#include <iostream>#include <fstream>#include <algorithm>#include <cstdio>using namespace std;#define N 20005int pa[N],dis[N];char s[2];int n;void init(){    for(int i=1;i<=n;i++){        pa[i]=i;        dis[i]=0;    }}int findset(int x){    if (pa[x]==x) return x;    int tmp=pa[x];    pa[x]=findset(pa[x]);    dis[x]+=dis[tmp];    return pa[x];}int main(){    //freopen("1.in","r",stdin);    int T, a, b;    cin>>T;    while (T--){        scanf("%d",&n);        init();        scanf("%s",s);        while (s[0]!='O') {            if (s[0]=='E') {                scanf("%d",&a);                findset(a);                printf("%d\n",dis[a]);            }            else {                scanf("%d%d",&a,&b);                pa[a]=b;                dis[a]=abs(a-b)%1000;                findset(a);            }            scanf("%s",s);        }    }    return 0;}