POJ-1988-Cube Stacking 解题报告

来源:互联网 发布:淘宝黑号是永久的吗 编辑:程序博客网 时间:2024/05/16 15:52

       这是一道关系型并查集题目。题意是说一共有30000个立方体,编号从1到30000。刚开始每个立方体各占用一个堆,然后接下来有P个操作,操作有两种:

1)M X Y,将编号为X 的立方体所在的堆移动到Y立方体所在的堆的上面;

2)C X,输出编号为X的立方体所在的堆上,在X立方体下面的立方体个数;


       讲讲自己的解题思路,首先,知道了X立方体所在堆的立方体总数以及在X立方体(包含X立方体)上面的立方体总数的话就可以轻而易举的求出在X立方体下面的立方体个数。

int bleg[N];    /*存储父节点*/int total[N];   /*表示堆中的立方体总数*/int up[N];      /*表示该立方体及其上立方体的总数*/int p;      /*操作数*/


       接下来讲合并操作,即M X Y操作,将fy的父节点修改为fx,这样就连接了两个堆为一个堆。然后我们修改fy的up数和fx的total数,我们不需要修改fy的total数,因为要知道一个立方体所在堆的立方体总数我们查找该堆的根节点的total数就可以了。那么total实际上存储的是当该节点为根节点时该堆的立方体总数。同理,up实际上存储的也是当该节点为根节点或者该节点的父节点为根节点的up数。

void Union(int x, int y){    int fx = Find(x);   /*x的根节点*/    int fy = Find(y);   /*y的根节点*/    if (fx == fy)       /*同一集合没必要合并了*/    {        return;    }    bleg[fy] = fx;  /*连接*/    up[fy] += total[fx];    /*修改y的根节点的up数*/    total[fx] += total[fy]; /*修改合并后的根节点的total*/    return;}

       那么开始查找操作,最重要的是它需要进行对x的路径压缩以及up的更新。

int Find(int x){    int y = x;    while (y != bleg[y])    {        y = bleg[y];    /*寻找根节点*/    }    while (y != bleg[x])    /*当父节点不是根节点*/    {        up[x] += up[bleg[x]] - 1;   /*更新up使x可以连接到x的父节点的父节点上*/        bleg[x] = bleg[bleg[x]];    /*更新x的父节点为父节点的父节点,也是路径压缩*/    }    return y;}

       千万不要忘了进行数据处理之前的初始化。

void Init(){    int i;    for (i=1; i<N; i++)    {        bleg[i] = i;        total[i] = 1;        up[i] = 1;    }    return;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 实训老师教不好怎么办 善心汇损失的钱怎么办 去陌生的地方怕传销怎么办 被执行人不提供财产线索怎么办 宽带ip地址改了怎么办 移动宽带恢复出厂设置了怎么办 移动100兆网速慢怎么办 手机显示无法解析dns地址怎么办 台式电脑宽带连接不上怎么办 电信宽带账号登录密码忘记了怎么办 电信校园宽带超时了怎么办 宽带连接账号密码忘了怎么办 移动宽带路由器上不了网怎么办 移动宽带太卡了怎么办 电信adsl密码忘记了怎么办 移动宽带无法连接网络怎么办 移动宽带电视无信号怎么办 联通网线故障电话打不通怎么办 w10系统ip地址错误怎么办 移动流量太贵了怎么办 修改wifi密码ip地址怎么办 苹果6s接电话声音小怎么办 k歌录音器失败怎么办 想报警但不能说话怎么办 微粒贷要家人电话怎么办 4g网络信号差怎么办 手机移动网络信号不好怎么办 移动的4g网络差怎么办 4g移动网络慢怎么办 房间没有4g网络怎么办 oppo显示2g网络怎么办 oppo只有2g网络怎么办 移动卡4g网络慢怎么办 易信专线电话用完了怎么办 手机拨打电话时黑屏怎么办 网易号文章一直审核中怎么办 登陆积分会员忘记密码怎么办 易信密码忘记了怎么办 滴滴永久封停的号怎么办 微信版本过低怎么办 报关时通关单号没录怎么办