HDU 2818&&POJ 1988 并查集简单应用

 因为并查集是递归找根节点是自下向上的 ,可以通过找根节点的过程中更新low值

 所以以箱子的底部为根节点

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 500000+5
#define IN freopen("in.txt","r",stdin)
int fa[N],have[N],low[N];//
void init(int n)
{
    for(int i=0; i<=n; i++){
        fa[i]=i;
        have[i]=1;
        low[i]=0;
    }
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    else
    {
        int f=fa[x];
        fa[x]=find(fa[x]);
        low[x]+=low[f];//更新操作
        return fa[x];
    }
}
void merge(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx==fy)//
    return ;
    fa[fx]=fy;
    low[fx]+=have[fy];//因为是X堆放在Y堆上,所以X堆的底部要加上Y堆所有的箱子个数
    have[fy]+=have[fx];//因为X,Y都已经是同一个父亲只需要更新父亲节点的have值
}
int main(){
    int p;
    //IN;
    scanf("%d",&p);
    init(30000);//初始化
    char c[2];
    int a,b;
    while(p--){
        scanf("%s",c);
        if(c[0]=='M'){
            scanf("%d%d",&a,&b);
            merge(a,b);
        }
        else
        {
            scanf("%d",&a);
            find(a);//查询前需要更新
            printf("%d\n",low[a]);
        }
    }
    return 0;
}


posted @ 2014-07-19 16:32  kewowlo  阅读(107)  评论(0编辑  收藏  举报