图论专题1考试Problem1

Problem 1. bricks
Input file: bricks.in
Output file: bricks.out
Time limit: 1 second
jyb 在BUAA 天天被大神虐,所以只能去搬砖了。
终于在2019 年的夏天,菜菜的jyb 找不到工作,真的去工地搬砖了。jyb 的工头cky 是一个很麻烦的人,他
会让jyb 按某种方式搬砖,还问会问一些奇怪的问题。
现在有n 块砖,m 次操作。操作有两种:
1. M x y 把编号为x 的砖所在的一摞砖搬到编号为y 的砖所在的一摞砖的上面。如果x 和y 在同一摞砖则
忽略这个操作。(最初,每块砖都是单独一摞)
2. C x 询问x 下面压着多少块砖。
jyb 搬砖实在是太累了,想请你帮忙回答一下cky 工头的询问。
Input
第1 行,2 个整数n;m,表示一共有多少块砖以及有多少操作。
接下来m 行,每行一个操作,操作表示形式与前文一致。
Output
对于每次询问操作,输出答案

bricks.in

6 6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4

bricks.out

1
0
2

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000010;
int father[maxn];
int n,m;
char opt[maxn];
int size[maxn];
int down[maxn],up[maxn];
int x,y;
int get(int x)
{
    int t;
    if(father[x]!=x)
    {
        t=father[x];
        father[x]=get(father[x]);
        up[x]+=up[t];
    }
    return father[x];
}
void merge(int x,int y)
{
    x=get(x);
    y=get(y);
    if(x!=y)
    {
        father[y]=x;
        up[y]=down[x];
        down[x]+=down[y];
    }
}
int main()
{
    freopen("bricks.in","r",stdin);
    freopen("bricks.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        father[i]=i;
        down[i]=1;
        up[i]=0;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%s",opt);
        if(opt[0]=='C')
        {
            scanf("%d",&x);
            printf("%d\n",down[get(x)]-up[x]-1);
        }
        else
        {
            scanf("%d%d",&x,&y);
            merge(x,y);
        }
    }
    return 0;
}

 

 

posted @ 2019-03-30 15:28  JBLee  阅读(214)  评论(0编辑  收藏  举报