首页 > 代码库 > (并查集+路径压缩) hdu 2818

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

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
6M 1 6C 1M 2 4M 2 6C 3C 4
 

 

Sample Output
102
 

 

Source
2009 Multi-University Training Contest 1 - Host by TJU
 
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;#define maxn 300100int 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