码迷,mamicode.com
首页 > 其他好文 > 详细

(并查集+路径压缩) hdu 2818

时间:2015-01-29 21:02:31      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

Building Block

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3352    Accepted Submission(s): 1003


Problem Description
John are playing with blocks. There are N blocks (1 <= N <= 30000) numbered 1...N。Initially, there are N piles, and each pile contains one block. Then John do some operations P times (1 <= P <= 1000000). There are two kinds of operation:

M X Y : Put the whole pile containing block X up to the pile containing Y. If X and Y are in the same pile, just ignore this command. 
C X : Count the number of blocks under block X 

You are request to find out the output for each C operation.
 

 

Input
The first line contains integer P. Then P lines follow, each of which contain an operation describe above.
 

 

Output
Output the count for each C operations in one line.
 

 

Sample Input
6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4
 

 

Sample Output
1 0 2
 

 

Source
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define maxn 300100
int n,fa[maxn],num[maxn],under[maxn];
char s[5];
int find(int x)
{
      if(x==fa[x])
            return x;
      int k=fa[x];
      fa[x]=find(fa[x]);
      under[x]+=under[k];
      return fa[x];
}
void Union(int x,int y)
{
      int fx,fy;
      fx=find(x),fy=find(y);
      if(fx!=fy)
      {
            under[fx]=num[fy];
            num[fy]+=num[fx];
            fa[fx]=fy;
      }
}
int main()
{
      int x,y;
      while(scanf("%d",&n)!=EOF)
      {
            for(int i=0;i<=n;i++)
                  fa[i]=i,num[i]=1,under[i]=0;
            for(int i=0;i<n;i++)
            {
                scanf("%s",s);
                if(s[0]==‘M‘)
                {
                      scanf("%d%d",&x,&y);
                      Union(x,y);
                }
                else if(s[0]==‘C‘)
                {
                      scanf("%d",&x);
                      find(x);
                      printf("%d\n",under[x]);
                }
            }
      }
      return 0;
}

  

(并查集+路径压缩) hdu 2818

标签:

原文地址:http://www.cnblogs.com/a972290869/p/4260770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!