POJ 1988 解答
这道题是一道并查集的应用。计算上从上往下算,是读了他人的文章才知道的,罪过罪过。
总的来说,可以让合并的两点x和y分别做parent,这样对应向上计算和向下计算两种方法。我们只用一种。
1 #include<stdio.h> 2 #include<stdlib.h> 3 int count=0; 4 int p[30005]; 5 int num[30005]; 6 int up[30005]; 7 8 int find_set(int x); 9 void link(int x,int y); 10 void make_set(int x) 11 { 12 p[x] = x; 13 num[x] = 1; 14 up[x] = 0; 15 } 16 17 void Union(int x, int y) 18 { 19 if (x == y) 20 return; 21 x = find_set(x); 22 y = find_set(y); 23 p[y] = x; 24 up[y] += num[x]; 25 num[x] += num[y]; 26 27 } 28 29 int find_set(int x) 30 { 31 if (x != p[x]) 32 { 33 int t = p[x]; 34 p[x] = find_set(p[x]); 35 up[x] += up[t]; 36 } 37 return p[x]; 38 } 39 40 int main() 41 { 42 int P; 43 int i,j; 44 scanf("%d",&P); 45 char Ops; 46 int x,y; 47 for(i=1;i<=30004;i++) 48 make_set(i); 49 while(P) 50 { 51 getchar(); 52 scanf("%c",&Ops); 53 if(Ops == 'M') 54 { 55 scanf("%d %d",&x, &y); 56 Union(x,y); 57 58 } 59 else if(Ops == 'C') 60 { 61 scanf("%d",&x); 62 int temp = find_set(x); 63 printf("%d\n",num[temp] - up[x] - 1); 64 } 65 P--; 66 } 67 system("pause"); 68 return 0; 69 }
浙公网安备 33010602011771号