enlaces a los temas: http://icpc.njust.edu.cn/Problem/Hdu/1213/
Una estructura de datos inconexos conjunto de apoyo a buscar y combinar, la operación en el bosque, la compresión de caminos, y se combinan para encontrar la complejidad del tiempo son casi constante. Y comprobar la función más básica es establecer un conjunto de los llamados "relación" entre los diferentes puntos, y la consulta de si los dos están relacionados. Y un conjunto de características es cheque relación transitiva Vectorial, como A-> B B-> C, hay A-> C, no es particularmente entre los vectores de transferencia de imágenes? En muchos casos, la aplicación y comprobar el conjunto están relacionados con esta propiedad. Presidente y comprobar el segmento de código conjunto comparable de lo orz problema con la placa hdu1213-árbol de amable, de la siguiente manera:
1 #include <bits / STDC ++ h.> 2 usando espacio de nombres std; 3 typedef unsigned int ui; 4 typedef largo largo ll; 5 typedef unsigned largo largo ULL; 6 #define pf printf 7 #define mem (a, b) memset (a, b, sizeof (a)) 8 #define prime1 1E9 + 7 9 #define prime2 1E9 + 9 10 #define pi 3,14159265 11 #define LSON l, mediados, tr << 1 12 #define rson mitad + 1, r, rt << 1 | 1 13 #define Scand (x) scanf ( "% LLF", y x) 14 #define f (i, a, b) for (int i = a; i <= b; i ++) 15 #define de exploración (a) scanf ( "% d", y a) 16 #define pf (a, b) make_pair ((a), (b)) 17 #define P par <int, int> 18 #define dbg (args) cout << # args << ":" << args << endl; 19 #define inf 0x3f3f3f3f 20 inline int read () { 21 int ans = 0 , w = 1 ; 22 Char ch = getchar (); 23 , mientras que (!(ch == ' - ' ) w = - 1 ; ch = getchar ();} 24 mientras que (isdigit (ch)) ans = (ANS << 3 ) + (ans << 1 ) + CH- ' 0 ' , ch = getchar (); 25 de retorno ans * w; 26 } 27 const int maxN = 1E6 + 10 ; 28 int n, m, t; 29 int f [maxN]; 30 conjunto < int > s; 31 void init () 32 { 33 F (I, 1. , N-) F [I] = I; 34 es s.clear (); 35 } 36 int Find ( int X) 37 [ { 38 es SI (X == F [X]) de retorno X; 39 F [ X] = Encuentra (F [X]); // camino compresor, o puede constituir una extremadamente desigual árbol 40 de retorno F [X]; 41 es } 42 es vacío de Unión ( int X, int y) 43 está { 44 es int = FX Find (X); 45 int FY = Encuentra (Y); 46 es SI(FX == FY) de retorno ; // tiene el mismo árbol 47 el otro 48 { 49 F [FX] = AF; 50 // no poner un árbol en el árbol de B se encuentra en la raíz conectado la raíz del árbol, se combinaron para lograr 51 es } 52 es } 53 es 54 es int main () 55 { 56 es // el freopen ( "input.txt", "R & lt", stdin); 57 es // el freopen ( "output.txt", "W ", stdout); 58 std :: :: iOS sync_with_stdio ( false ); 59 T = Read (); 60 int a, B; 61 es el tiempo (T-) 62 es { 63 es n- = Read (), m = Read (); 64 el init (); 65 F (I, . 1 , m) A = Read (), B = Read (), de Unión (A, B); 66 f (i, . 1 , n) s.insert (Buscar (I)); // ver cuántas independiente árbol 67 PF ( " % D \ n " , s.size ()); 68 } 69 }