1. 程式人生 > >hdu 2818(帶權並查集)

hdu 2818(帶權並查集)

思路:Count[i]表示i下面的積木個數,路徑壓縮的時候更新一下即可,sum[i]表示以i為根的積木的個數。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAXN 30000+30
 7 int parent[MAXN];
 8 int sum[MAXN],Count[MAXN];
 9 int n;
10 
11 void Initiate() {
12     memset(Count,0
,(MAXN)*sizeof(int)); 13 for(int i=0; i<=MAXN; i++) { 14 parent[i]=i; 15 sum[i]=1; 16 } 17 } 18 19 int Find(int x) { 20 if(x==parent[x]) 21 return x; 22 int tmp=Find(parent[x]); 23 Count[x]+=Count[parent[x]]; 24 return parent[x]=tmp; 25 } 26 27 void
Union(int u,int v) { 28 int r1=Find(u),r2=Find(v); 29 if(r1==r2)return ; 30 parent[r1]=r2; 31 Count[r1]=sum[r2]; 32 sum[r2]+=sum[r1]; 33 } 34 35 int main() { 36 char str[2]; 37 int u,v; 38 // freopen("1.txt","r",stdin); 39 scanf("%d",&n); 40 Initiate(); 41 while
(n--) { 42 scanf("%s",str); 43 if(str[0]=='M') { 44 scanf("%d%d",&u,&v); 45 Union(u,v); 46 } else { 47 scanf("%d",&u); 48 Find(u); 49 printf("%d\n",Count[u]); 50 } 51 } 52 return 0; 53 }
View Code