并查集-poj-1988-Cube Stacking

来源:互联网 发布:php微信支付视频教程 编辑:程序博客网 时间:2024/05/17 04:58

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;int fa[153333],   ///根节点编号    ra[153333],   ///到根节点距离    num[153333];  ///以这个点为根的树的大小void inti(int n) {          ///初始    for(int i=1;i<=n;i++) {        fa[i]=i;        ra[i]=0;        num[i]=1;    }}int find_fa(int n) {    if(n!=fa[n]) {        int tt=fa[n];       ///临时储存父节点的编号,查找后会变        fa[n]=find_fa(fa[n]);  ///查找根        ra[n]+=ra[tt];         ///将当前节点的权值修改为到父节点的值加上到父节点到根的值    }    return fa[n];}int main(){    int p;    char op[10];    scanf("%d",&p);    inti(p);    while(p--) {        scanf("%s",op);        int x,y;        if(op[0]=='M') {            scanf("%d%d",&x,&y);            int fx=find_fa(x);            int fy=find_fa(y);      ///修改将fx添加到fy上            if(fx!=fy) {        ///如果不是同一堆石头                fa[fx]=fy;      ///将第x堆石头添加到第Y堆石头后面                ra[fx]+=num[fy];    ///将fx的到根的距离加上以fy为根的集合的个数                num[fy]+=num[fx];   ///将fy为根的集合的个数加上fx            }        }        else {            scanf("%d",&x);            int fx=find_fa(x);            cout << ra[x] << endl;        }    }    return 0;}

题目意思是有n块石头,两种操作M x y和C x 前一种操作表示将有x的石头放到有y的石头堆上 后一种操作问的是x下面有多少石头。

代码如下:


0 0
原创粉丝点击