poj1988 cube stacking

本文介绍了一个利用并查集算法处理多个栈之间的压入和计数操作的问题。通过对并查集的根节点进行维护和更新,实现栈间操作的高效处理。文章详细解释了并查集的实现原理及路径压缩技术,并提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
      给n个栈,存取的数据为123···n;现在执行两种操作:(M X Y)为将包含X的栈压入包含Y的栈里;(CX)为输出包含X的栈里,X下面数的个数。

题目分析:参考 http://blog.sina.com.cn/s/blog_626049050100k57s.html;虽然是并查集,但是还是不是很清楚的思路,关键还是要清楚根节点更新,那么相应的子节点也要相应的更新(路径压缩)。

题目代码:
#include
#define MAX 40000
  using namespace std;

  struct node
  {
    int parent;
    int  sum;
    int up;
  };

node st[MAX];
void Union(int u,int v);
int find(int x);

int main ()
{
    int n,m;
    int i,j;
    int u,v;
    char act;
    cin>>n;

    for(i=1;i
    {
      st[i].parent=i;
      st[i].sum=1;
      st[i].up=0;
    }

    while(n--)
    {
        cin>>act;

        if(act=='M')
        {
            cin>>u>>v;
            Union(u,v);
        }

        else if(act=='C')
          {
              cin>>u;
              m=find(u);
              cout<<st[m].sum-st[u].up-1<<endl;
          }

    }


    return 0;
}

void Union(int u,int v)               //将包含u的栈,压入包含v的栈  操作的是根节点
{
    u=find(u);                     
    v=find(v);

    st[v].parent=u;
    st[v].up=st[u].sum;
    st[u].sum+=st[v].sum;

}

int find(int x)                                 //返回包含x所在的根节点
{
    int p;
    if(st[x].parent!=x)
    {
        p=st[x].parent;                           //保存原有的根节点,以便新增根节点时,旧的被覆盖
          st[x].parent=find(st[x].parent);          //路径压缩使得节点中parent都为根节点。
        st[x].up+=st[p].up;                       //本节点的up加上旧根节点的up,为新增根节点后的up
     

    returnst[x].parent;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值