POJ1988 Cube Stacking——并查集——Pku1988

比较巧妙的并查集,考察对并查集的引申应用。维护三个数组:

a[i]表示i到pre[i]中间有方块的个数

pre[i]表示i所在集合编号,即根

c[i]表示以i为标志的集合中元素个数,只有当pre[i]=i的时候c[i]才有意义

合并时,只需进行如下操作:

1、对读入的x、y分别进行路径压缩,直到找到真根为止

2、合并x、y两个集合,主要步骤如下:

    pre[x]:=y;a[x]:=c[y];c[y]:=c[y]+c[x];

这道题目倒是和银河英雄传说有些相似之处,可以对比着来做一下。

 1 program cubes;//by_poetshy
2 const
3 maxn=30000;
4 var
5 i,n,p,q :longint;
6 pre,a,c :array[1..maxn]of longint;
7 ch :char;
8
9 procedure combine(x,y:longint);
10 begin
11 pre[x]:=y;
12 a[x]:=c[y];
13 inc(c[y],c[x]);
14 end;
15
16 function find_set(i:longint):longint;
17 var fa:longint;
18 begin
19 if pre[i]=i then exit(i);
20 fa:=pre[i];
21 pre[i]:=find_set(pre[i]);
22 inc(a[i],a[fa]);
23 exit(pre[i]);
24 end;
25
26 procedure union(p,q:longint);
27 begin
28 combine(find_set(p),find_set(q));
29 end;
30
31 begin
32 readln(n);
33 for i:=1 to maxn do
34 begin
35 pre[i]:=i;c[i]:=1;a[i]:=0;
36 end;
37 for i:=1 to n do
38 begin
39 read(ch);
40 if ch='m' then
41 begin
42 readln(p,q);
43 union(p,q);
44 end else
45 begin
46 readln(p);
47 pre[p]:=find_set(p);
48 writeln(a[p]);
49 end;
50 end;
51 end.

转载于:https://www.cnblogs.com/Thispoet/archive/2011/08/30/2160161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值