poj 1988 Cube Stacking

并查集用的很巧妙
#include <stdio.h>
#include 
<string.h>

int parent[30010], count[30010];

void init()
{
    memset(parent, 
-1sizeof(parent));
    memset(count, 
0sizeof(count));
}

int find(int i)
{
    
if ( 0 > parent[i] )
        
return i;
    
int t= parent[i];
    parent[i]
= find(parent[i]);
    count[i]
+=count[t];
    
return parent[i];
}

void unionset(int a, int b)
{
    a
= find(a);
    b
= find(b);
    
if ( a == b ) return;
    
int t= parent[a];
    parent[a]
= b;
    count[a]
= count[a]-parent[b];
    parent[b]
+=t;
}

int main()
{
    
int n, a, b;
    
char ch;
    scanf(
"%d"&n);
    init();
    
while ( n-- )
    {
        scanf(
"%*c%c"&ch);
        
if ( 'M' == ch )
        {
            scanf(
"%d%d"&a, &b);
            unionset(a, b);
        }
        
if ( 'C' == ch )
        {
            scanf(
"%d"&a);
            find(a);
            printf(
"%d\n", count[a]);
        }
    }
    
return 0;
}

posted on 2011-09-06 17:50 purplest 阅读(162) 评论(0)  编辑 收藏 引用 所属分类: 并查集


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论