Consejos:
10 ≤ N . 4 , si no hay entrada sigue el camino puede ser comprimido a cabo.
10000
2 1 2
2 3 4
2 5 6
......
2 9997 9998
2 9999 10000
2 9999 9997
......
2 5 3
2 3 1
10000
10000 10000
......
10000 10000
Pero, de hecho, dos usos del tiempo de ejecución de 50 ms aproximadamente.
$ {O _ {\ left (n ^ 2/2 \ right)}} $:
#include <bits / STDC ++ h.> usando espacio de nombres std; const int M = 11.000 ; int vie [M]; bool vis [M]; int Encuentra ( int x) { mientras que (x = vie [x]!) x = vie [x]; retorno X; } vacío Unión ( int A, int B) { int Fría = Encuentra (A); int FRIB = Encuentra (B); si (fria> FRIB) vie [Fría] = FRIB; si (FRIB> Fría) vie [FRIB] = fria; } int main () { para ( int i = 0 ; i <M; i ++) vie [i] = i; int n; cin >> n; para ( int i = 0 ; i <n; i ++ ) { int k; cin >> k; int a [k]; para ( int j = 0 ; j <k; j ++ ) { cin >> un [j]; vis [a [j]] = verdadero ; si (j) Unión (a [j], un [j- 1 ]); } } int personas = 0 , tribu = 0 ; para ( int i = 0 ; i <M; i ++ ) { si (vis [i]) ++ personas; si (vis [i] && vie [i] == i) ++ tribu; } cout << << la gente " " << tribu << " \ n " ; int q; cin >> q; para ( int i = 0 ; i <q; i ++ ) { int a, b; cin >> a >> b; cout << (Encontrar (a) == Encuentra (b)? " Y " : " N " ) << " \ n " ; } volver 0 ; }
$ {O _ {\ left (n \ right)}} $:
#include <bits / STDC ++ h.> usando espacio de nombres std; const int M = 11.000 ; int vie [M]; bool vis [M]; int Encuentra ( int x) { int = f x; mientras que (! f = vie [f]) f = vie [f]; int a = x, b; mientras que (a = vie [a]!) b = vie [a], vie f [a] =, a = b; volver f; } vacío Unión ( int A, int B) { int Fría = Encuentra (A); int FRIB = Encuentra (B); si (fria> FRIB) vie [Fría] = FRIB; si (FRIB> Fría) vie [FRIB] = fria; } int main () { para ( int i = 0 ; i <M; i ++) vie [i] = i; int n; cin >> n; para ( int i = 0 ; i <n; i ++ ) { int k; cin >> k; int a [k]; para ( int j = 0 ; j <k; j ++ ) { cin >> un [j]; vis [a [j]] = verdadero ; si (j) Unión (a [j], un [j- 1 ]); } } int personas = 0 , tribu = 0 ; para ( int i = 0 ; i <M; i ++ ) { si (vis [i]) ++ personas; si (vis [i] && vie [i] == i) ++ tribu; } cout << << la gente " " << tribu << " \ n " ; int q; cin >> q; para ( int i = 0 ; i <q; i ++ ) { int a, b; cin >> a >> b; cout << (Encontrar (a) == Encuentra (b)? " Y " : " N " ) << " \ n " ; } volver 0 ; }