tribu GPLT L2-024 (disjuntos-set)

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 ;
}

 

Supongo que te gusta

Origin www.cnblogs.com/Kanoon/p/12509866.html
Recomendado
Clasificación