This question is almost the same as 1703, that is, whether the vertex between two points is an even number or a base number, the key is to record the weights of each vertex (that is, the number of layers of each vertex in the tree )... For example, if two strings are 1-2-3 and 4-5-6-7, it is a headache to change the weights of points in the merged string, as long as this problem is solved, the problem will be solved. A typical idea is to use Fa [I] to represent the parent node of I. path compression is performed here, so each parent node of I is the root node of the tree where it is located .. PV [I] is used to represent the weight of I, that is, the number of layers in the tree where node I is located (in fact, due to path compression, all trees have only two layers, and one layer is the root node, A layer is a subnode, but for calculation, the layer where each node should be located is noted down )... The core code is: Void Init (int n ){ Int I; For (I = 0; I <= N; I ++ ){ Fa [I] =-1; // initialize that the parent node of each node is-1, and that of each node is 0; PV [I] = 0; } } Int find (int I ){ Int R; If (Fa [I] <0) Return I; // If I is the root node, the value of I is returned. R = find (Fa [I]); // find the root node of I PV [I] + = PV [Fa [I]; // note that this step is not very important. If it is a plus of a point and a point, this step does not work, because Fa [I] must be the root node, and its weight is 0, but if the child nodes of the two trees are connected, such as 1-2-3, 4-5-6-7. then the connection between 3 and 6 is very important, because after the connection, the power of 4 is changed to 2, and the book of 567 also needs to change. This change is not a direct change, instead, each subsequent find operation adds 2 to 567 to form the connected layers !!! Fa [I] = R; Return R; } Void unit (int A, int B ){ Int Ra = find (a); // adjust the weights of A and B to the obtained weights through the find operation. Int RB = find (B ); If (Pv [a]> PV [B]) {// if 1-2 is connected to 2-3, the weights of 2 and 3 must be determined, otherwise, enter 2, 3, and 2 to get different answers... Fa [RB] = Ra; PV [RB] = PV [a]-PV [B] + 1; } Else { Fa [Ra] = RB; PV [Ra] = PV [B]-PV [a] + 1; } } AC code: # Include <stdio. h> # Define M1 2005 Int Fa [M1], PV [M1]; Void Init (int n ){ Int I; For (I = 0; I <= N; I ++ ){ Fa [I] =-1; PV [I] = 0; } } Int find (int I ){ Int R; If (Fa [I] <0) Return I; R = find (Fa [I]); PV [I] + = PV [Fa [I]; Fa [I] = R; Return R; } Void unit (int A, int B ){ Int Ra = find (); Int RB = find (B ); If (Pv [a]> PV [B]) { Fa [RB] = Ra; PV [RB] = PV [a]-PV [B] + 1; } Else { Fa [Ra] = RB; PV [Ra] = PV [B]-PV [a] + 1; } } Void main (){ Int I, N1, A, B, Count = 0, flag, M, N; Scanf ("% d", & N1 ); While (N1 --){ Flag = 1; Count ++; Scanf ("% d", & N, & M ); Init (N ); For (I = 0; I <m; I ++ ){ Scanf ("% d", & A, & B ); If (FLAG ){ If (find ()! = Find (B )) Unit (A, B ); Else { If (Pv [a] + PV [B]) % 2 = 0 ){ Printf ("Scenario # % d:/nsuspicious bugs found! /N ", count ); Flag = 0; } } } } If (FLAG) Printf ("Scenario # % d:/Nno suspicious bugs found! /N ", count ); } } 1988 cube stacking for the same type of questions: Http://acm.pku.edu.cn/JudgeOnline/problem? Id = 1988 AC code: # Include <stdio. h> # Deprecision Max 30001 Int Fa [Max], down [Max], up [Max]; Void Init (){ Int I; For (I = 0; I <Max; I ++ ){ Fa [I] = I; Down [I] = 1; Up [I] = 0; } } Void Link (int x, int y ){ Fa [y] = X; Up [y] = down [x]; Down [x] + = down [y]; } Int getup (INT top, int ){ If (Fa [a]! = Top ){ Up [a] + = getup (top, Fa [a]); Fa [a] = top; } Return up [a]; } Int find (int I ){ Int R; If (Fa [I]! = I ){ R = find (Fa [I]); Getup (R, I); // here, the value of up [I] to be changed is changed for each find operation .. } Return Fa [I]; } Void unit (int x, int y ){ Link (find (x), find (y )); } Void main (){ Int I, n, A, B; Char C; Scanf ("% d", & N ); Init (); While (n --){ Getchar (); Scanf ("% C", & C ); If (C = 'M '){ Scanf ("% d", & A, & B ); Unit (A, B ); } Else if (C = 'C '){ Scanf ("% d", & ); Printf ("% d/N", down [find (a)]-up [a]-1 ); } } } And query other questions: http://acm.pku.edu.cn/JudgeOnline/problem? Id = 1611 the suspect Http://acm.pku.edu.cn/JudgeOnline/problem? Id = 2985*K*-Th largest group (unfinished) |