poj 1988 Cube Stacking 并查集

题目链接

题目意思就是将M a,b 就是将a所在的堆放到b所在的堆的上面。 C n  就是计算 n下面的箱子的个数

注意: 题目中需要开辟两个变量 记录堆中箱子的总个数和 本箱子上面的箱子个数

然后利用并查集,对两堆箱子进行合并,然后(上面的箱子的根节点)的 是(下面箱子根节点)的父节点。

然后更新(上面箱子的根节点的总个数)(记录的是两堆箱子合并后的总个数),(更新新面箱子的根节点的记录此箱子上面还有几个箱子的值)(这里注意因为查找根节点时会自动更新下面每个箱子的up(该箱子上面箱子的个数)的值 )。

post code:

#include<stdio.h>
#include<string.h>
struct node{
    int father;
    int sum;
    int up;
} cube[100000];
char judge[3];
int Find(int i){
   int father=cube[i].father; //这里记住每个箱子的父节点    
   if(i==cube[i].father)return i;
   cube[i].father=Find(cube[i].father);    
   cube[i].up+=cube[father].up;   //然后对其up(该箱子上面的箱子个数)进行更新 
   return cube[i].father; 
}

void Union(int top,int down){
      int Ftop=Find(top);     
      int Fdown=Find(down);
      if(Ftop!=Fdown){
         cube[Fdown].father=Ftop;
         cube[Fdown].up+=cube[Ftop].sum;
         cube[Ftop].sum+=cube[Fdown].sum;
      }     
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
         for(int i=1;i<=n;i++){
             cube[i].father=i;
             cube[i].sum=1;    
             cube[i].up=0;    
         }                          
         int top,down;
         for(int i=1;i<=n;i++){
             scanf("%s",judge);
             if(judge[0]=='M'){
                scanf("%d%d",&top,&down);
                Union(top,down);    
             }    
             else {
               int box,Fbox;
               scanf("%d",&box);
               Fbox=Find(box);  //查找过程中对于up值进行了更新
               printf("%d\n",cube[Fbox].sum-1-cube[box].up);  //根节点记录总个数-给箱子上面的箱子的个数-该箱子就是下面箱子的个数
             }    
         }
                                               
    }

} 
/*
100
M 1 6
M 2 4
M 1 2
C 4



*/



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值