博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1988 Cube Stacking(带权并查集)
阅读量:5164 次
发布时间:2019-06-13

本文共 1482 字,大约阅读时间需要 4 分钟。

哈哈,一次AC。

题意:给你 1-n 编号的立方体,然后移动包含指定编号的立方体的堆移到另一个堆上边,    

  询问指定的编号立方体下面有多少个立方体。

思路:由于并查集是存储的是它的父亲,那么只能从父亲那里更新数据,即只能往上推,不能往下推。

   所以我干脆倒过来思考,它让我求编号为i的立方体下面有多少立方体,    

   那么我只要求在它上方的立方体个数,假设为m。以及整个堆中立方体的个数tot,则答案为tot-m-1,1为它自己。

      开一个数组upnum,存储编号为i的立方体上方的立方体个数。    

  每次再查找父节点路径压缩之前先更新,从最顶层即根节点往底层更新

 

#include 
#include
#include
#include
#include
#include
using namespace std;const int maxn=30010;int father[maxn];int ranks[maxn]; //表示以i为根节点的集合中所含有的个数int upnum[maxn]; //upnum[i]表示在i顶上的骰子个数int p,q;void init(){ for(int i=0;i<=maxn;i++){ father[i]=i; ranks[i]=1; }}//x的父节点更新完相应的upnum后,才能更新x的upnumint update(int x){ if(father[x]==x) return upnum[x]; else{ upnum[x]+=update(father[x]); return upnum[x]; }}int find_root(int x){ if(father[x]!=x){ father[x]=find_root(father[x]); } return father[x];}void Union(int a,int b){ upnum[a]+=update(father[a]); upnum[b]+=update(father[b]); int x=find_root(a); int y=find_root(b); if(x==y) return; father[y]=x; upnum[y]+=ranks[x]; ranks[x]+=ranks[y];}int main(){ int a,b; char ch[4]; scanf("%d",&p); memset(upnum,0,sizeof(upnum)); init(); for(int i=1;i<=p;i++){ scanf("%s",ch); if(ch[0]=='M'){ scanf("%d%d",&a,&b); Union(a,b); } else{ scanf("%d",&a); upnum[a]+=update(father[a]); int root=find_root(a); //求在a下方的立方体个数 int downnum=ranks[root]-upnum[a]-1; printf("%d\n",downnum); } } return 0;}

 

 

 

转载于:https://www.cnblogs.com/chenxiwenruo/p/3289502.html

你可能感兴趣的文章
html总结(一)
查看>>
指针数组和数组指针,指针函数和函数指针
查看>>
Numpy学习笔记
查看>>
SQL语句中截取字符串Substr
查看>>
DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录
查看>>
Application Pool Identities
查看>>
Codeforces 938C - Constructing Tests
查看>>
8.2 文件输入输出
查看>>
多用户磁盘管理 - lvm + quota
查看>>
Nginx服务编译安装、日志功能、状态模块及访问认证模式实操
查看>>
2017-3-24 开通博客园
查看>>
【MySQL性能优化】MySQL常见SQL错误用法
查看>>
python学习手册笔记——25.OOP宏伟蓝图
查看>>
3.6 字符串
查看>>
Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
查看>>
smarty模板(转载)
查看>>
四年多没碰C++了。。。
查看>>
nginx负载均衡 ->Tomcat8集群 -> sentinel集群 -> redis3主从
查看>>
Tomato的init启动流程分析(原创)
查看>>
java中static使用之静态方法注意点
查看>>