有权并查集,Poj(1988)

题目链接:http://poj.org/problem?id=1988

题目大意:

有n个从1到n编号的箱子,将每个箱子当做一个栈,对这些箱子进行p次操作,每次操作分别为以下两种之一:

输入 M x y:表示将编号为x的箱子所在的栈放在编号为y的箱子所在栈的栈顶.
输入 C x:计算编号为x的所表示的栈中在x号箱子下面的箱子数目.

思路:

move a,b的时候(合并的时候),b其中一个作为子树,dist[fb],距离根节点的距离为size[fa],然后size[fa]+=size[fb];

count c的时候,就是size[fa[c]]-dist[c]-1啦。

注意的是:Find_set的时候,要将dist处理好啦,(还是在同一个树中)

if(x!=father[x])

int t=father[x];

father[x]=Find_set[father[x]];

dist[x]+=dist[t];

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

const int maxn = 30000+10;
int father[maxn];
int size[maxn];        ///表示团的大小
int dist[maxn];        ///到根节点的距离

int Find_set(int x)
{
    if(x!=father[x])
    {
        int t=father[x];
        father[x] = Find_set(father[x]);
        dist[x]+=dist[t];
    }
    return father[x];
}

void Union(int x,int y)
{
    father[y] = x;
    dist[y] = size[x];
    size[x] +=size[y];
}

int main()
{
    for(int i=0;i<maxn;i++)
    {
        father[i] = i;
        dist[i] = 0;
        size[i] = 1;
    }
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        char order;
        scanf("%c",&order);
        if(order==‘M‘)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            getchar();
            int fa = Find_set(x);
            int fb = Find_set(y);
            if(fa!=fb)
                Union(fa,fb);
        }
        else {
            int c;
            scanf("%d",&c);
            getchar();
            printf("%d\n",size[Find_set(c)]-dist[c]-1);
        }
    }
    return 0;
}
时间: 2024-12-10 00:09:59

有权并查集,Poj(1988)的相关文章

(带权并查集)poj 1988

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 20392   Accepted: 7148 Case Time Limit: 1000MS Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start w

并查集 POJ 1988 Cube Stacking

题目传送门:    -------->这里<---------- 题目大意: 有标记1-N的方块,初始时一个砖块是一堆.然后进行以下操作 M X Y : 将 X 砖块所在堆 叠到 Y 砖块所在堆上面: C X :数在 X 砖块所在堆中 叠在X砖块下的砖块个数: 1<=N<=30000; 思路: 并查集,每一个砖块堆是一个集合.将每一堆的最上面一块砖设为根,合并时更新 Y 堆的根的 father 和 val (在Y上面的方块数) . 要达到这些目的,需要一个all数组,来记录每一堆里

并查集 POJ 1988

#include <cstdio> #define N 30010 int pa[N]; //parent int siz_tree[N]; //size of tree int d[N]; //dist between node and root int Find(int x) { if(pa[x] == x) return x; int t = pa[x]; pa[x] = Find(pa[x]); d[x] += d[t]; return pa[x]; } void Union(int

POJ 1988 Cube Stacking (带权并查集)

题目链接:http://poj.org/problem?id=1988 有n个元素,开始每个元素自己 一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈.第二种操作是询问含有x元素下面有多少个元素. 经典的带权并查集,cnt表示包含这个元素的集合中所有元素个数,dis表示这个元素离最上面元素的个数(距离). 看代码领会一下吧. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio>

【poj 1988】Cube Stacking(图论--带权并查集 模版题)

题意:有N个方块,M个操作{“C x”:查询方块x上的方块数:“M x y”:移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法:带权并查集.每堆方块作为一个集合,维护3个数组:fa[x]表示x方块所在堆的最顶部的方块:d[x]表示x方块所在堆的最底部的方块:f[x]表示x方块方块x上的方块数. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<

POJ 1988 Cube Stacking 【带权并查集】

<题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所在stack中,在x之下的cube的个数. 解题分析:由于要实现大量数的移动和归属关系,所以想到可能要用并查集,但是毫无疑问,普通的并查集不能够实现统计在x下的cube个数这一功能,所以我们通过带权并查集来实现,每一个stack,以最高的点为根,然后每一个点维护两个权值,它的子树节点个数(包括它自身),和它到

POJ 1984 Navigation Nightmare 二维带权并查集

题目来源:POJ 1984 Navigation Nightmare 题意:给你一颗树 k次询问 求2点之间的曼哈顿距离 并且要在只有开始k条边的情况下 思路:按照方向 我是以左上角为根 左上角为原点 dx[i]为i点距离根的x坐标 dy[]是y坐标 这两个可以通过路径压缩求出 只不过是二维而已 #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int m

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物

POJ 2492 A Bug&#39;s Life (带权并查集 &amp;&amp; 向量偏移)

题意 : 给你 n 只虫且性别只有公母, 接下来给出 m 个关系, 这 m 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配关系. 分析 : 本题雷同POJ 1182 食物链, 如果会了那一题, 那现在这题便简单多了, 建议先了解食物链的偏移向量做法.这里也是使用向量的思考方式来进行relation的变化, 这里我令 relation = 0为同性, relation = 1为异性, 接下来的步骤就和食物链的雷同了. 优

POJ 1182 食物链(带权并查集)

http://poj.org/problem?id=1182 题意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话