Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198259
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-09-20 17:55:47

 


#include<stdio.h>

const int MAX=30005;
struct Tree
{
    int parent,deep;
};
Tree pre[MAX];

void initial()
{
    for(int i=1;i<MAX;i++)
    {
        pre[i].parent=-1;    //若为正值则记录父件,若为负值则记录集合元素的个数,包括树根

        pre[i].deep=0;        //记录到根节点的距离,必须规定树根的深度为0

    }
}

int find(int x)
{
    if(pre[x].parent<0) return x;
    int temp=pre[x].parent;
    pre[x].parent=find(pre[x].parent);
    pre[x].deep+=pre[temp].deep; //若树根的深度非0,则在重复查找树根时执行此句会造成子结点的深度的累加而出错                                                                

    return pre[x].parent;
}

void move(int x1,int x2)
{
    int r1=find(x1);
    int r2=find(x2);
    
    if(r1==r2) return ;
    pre[r2].deep=-pre[r1].parent;
    pre[r1].parent+=pre[r2].parent;
    pre[r2].parent=r1;
}

int main()
{
    int p;
    scanf("%d",&p);
    initial();
    char str[2];
    for(int i=0;i<p;i++)
    {
        scanf("%s",str);
        if(str[0]=='M')
        {
            int x1,x2;
            scanf("%d%d",&x1,&x2);
            move(x1,x2);
        }
        else
        {
            int x;
            scanf("%d",&x);
            int root=find(x);
            printf("%d\n",-pre[root].parent-pre[x].deep-1);
        }
    }
    return 0;
}


总结:

并查集的一般用法。

阅读(1058) | 评论(0) | 转发(0) |
0

上一篇:pku1456 Supermarket

下一篇:pku1011 Sticks

给主人留下些什么吧!~~