杭电2818

来源:互联网 发布:adobe ps mac 破解版 编辑:程序博客网 时间:2024/06/01 11:24

参考了网上某些大神的思路,之后自己独立写了出来。

首先要把题读懂,这是关键。

计算的是x下面的箱子的数量,用up,down数组分别表示x上面盒子的数量和下面盒子的数量。利于此题的解答。

附上代码:

#include<stdio.h>const int N=30000+10;int a[N],up[N],down[N];int n,m;void makeset(){    int i;    for(i=0;i<N;i++)    {        a[i]=i;        up[i]=0;        down[i]=1;    }}int find1(int n){    int t;    t=a[n];    if(t!=n)    {        a[n]=find1(t);        up[n]+=up[t];    }    return a[n];}void union1(int x,int y){    int px=find1(x);    int py=find1(y);    if(px!=py)    {        a[py]=px;        up[py]=down[px];        down[px]+=down[py];    }}void count1(int x){    int root=find1(x);    printf("%d\n",down[root]-up[x]-1);}int main(){    int i,j,k;    int a1,b1,c1;    while(scanf("%d",&n)==1)    {        getchar();        makeset();        while(n--)        {            char ch;            scanf("%c",&ch);            if(ch=='M')            {                scanf("%d%d",&a1,&b1);                union1(a1,b1);            }            else if(ch=='C')            {                scanf("%d",&c1);                count1(c1);            }            getchar();        }    }    return 0;}


0 0
原创粉丝点击