码迷,mamicode.com
首页 > 其他好文 > 详细

【poj 1988】Cube Stacking(图论--带权并查集 模版题)

时间:2016-11-02 23:50:50      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:ret   names   图论   lib   main   stream   i++   集合   ring   

题意:有N个方块,M个操作{“C x”:查询方块x上的方块数;“M x y”:移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}。输出相应的答案。

解法:带权并查集。每堆方块作为一个集合,维护3个数组:fa[x]表示x方块所在堆的最顶部的方块;d[x]表示x方块所在堆的最底部的方块;f[x]表示x方块方块x上的方块数。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 const int N=30010,M=100010;
 8 int fa[N],f[N],d[N];
 9 char s[3];
10 
11 int ffind(int x)
12 {//查找+更新 关于x的所有值
13     if (fa[x]!=x)
14     {
15       int fx=fa[x];
16       fa[x]=ffind(fx);
17       f[x]+=f[fx];
18       d[x]=d[fx];
19     }
20     return fa[x];
21 }
22 int main()
23 {
24     int n,m,x,y;
25     scanf("%d",&m);
26     for (int i=1;i<=N-10;i++) fa[i]=d[i]=i,f[i]=0;
27     while (m--)
28     {
29       scanf("%s",s);
30       if (s[0]==M)
31       {
32         scanf("%d%d",&x,&y);
33         int fx=ffind(x),fy=ffind(y);
34         fa[fy]=fx;//mainly 修改fy
35         ffind(d[fx]);//更新了之后才可用
36         f[fy]=f[d[fx]]+1;
37         d[fx]=d[fy];//修改fx
38       }
39       else
40       {
41         scanf("%d",&x);
42         int dx=d[ffind(x)];
43         ffind(dx);//更新了才有保障
44         printf("%d\n",f[dx]-f[x]);
45       }
46     }
47     return 0;
48 }

 

【poj 1988】Cube Stacking(图论--带权并查集 模版题)

标签:ret   names   图论   lib   main   stream   i++   集合   ring   

原文地址:http://www.cnblogs.com/konjak/p/6024740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!