Problema C: el camino más corto

Descripción

N ciudades, numeradas de 0 a N-1, M carretera, longitud de la carretera artículo K (K a partir de 0) es 2 ^ K, numerados en busca de otras ciudades a la ciudad 0 distancia más corta.

Entrada

La primera línea de dos números enteros positivos N (2 <= N <= 100) M (M <= 500), expresadas N ciudades, carreteras M,
las dos filas siguientes números enteros M, representa las dos ciudades conectadas número.

Salida

Fila N-1, representa un número de 0 a ciudad más cortos otras ciudades, si no llegar a la salida de -1, el valor del resultado es demasiado grande para la salida MOD 100.000.

Ejemplo de entrada

4 3 
0 1 
1 2 
2 0

Ejemplo de salida

1 
3 
-1

Enlaces de referencia: 1956 C Problema del camino más corto

El código AC final es como sigue:

#include <bits / STDC ++ h.>
 usando  espacio de nombres std;
const  int MAX = 105 , INF = - 1 ;
int padre [MAX], d [MAX] [MAX];
int findFather ( int x) { // 找父节点
    si (x == padre [x]) de retorno x;
    otra  vuelta findFather (padre [x]); 
} 
Int quickMi ( int a, int k, int mod) {
     int ans = 1 ;
    largo  largo  int res = a;
    al mismo tiempo (K) {
         SI (K & . 1 ) ANS = (ANS * RES)% MOD; 
        RES = (RES * RES)% MOD; // aquí no escrita = RES (RES * A) MOD%; 
        K = >> . 1 ; 
    } 
    retorno SNA; 
} 
int main () {
     int I, J, K, T, V, X, y, n-, m, DIS;
     el tiempo (Scanf ( " % D% D " !, y n-, y m) = el EOF) { 
        Fill (D [ 0 ], D [ 0 ] + * MAX MAX, INF); // initialize distancia array 
        para (i = 0 ; I <n-; I ++ ) {
            Padre [I] = I; // initialize disjuntos-set 
            D [I] [I] = 0 ; // array initialize distancia diagonal debe ser respuesta equivocada aquí olvidó 
        }
         para (K = 0 ; k <m; K ++ ) { 
            scanf ( " % D% D " , y U, y V); 
            X = findFather (U); 
            y = findFather (V);
             IF (! X = y) { // instrucciones u, v no está conectado 
                DIS = quickMi ( 2 , K, 100000 ); // Dado que el índice se utiliza el flash tanto poder 
                para (i = 0; I <n-; I ++ ) {
                     IF (x == findFather (I)) { // encontrar todos los puntos de la x conjunto como el nodo raíz 
                        para (J = 0 ; J <n-; J ++ ) {
                             IF (Y == findFather (J)) { // encontrar todos los puntos en el conjunto como un nodo raíz y 
                                d [i] [j] = d [j] [i] = (d [i] [u] + dis + d [v] [J])% 100 000 ; // actualización 
                            } 
                        } 
                    } 
                } 
                Padre [Y] = X; // fusionar las dos colecciones 
            } 
        } 
        para (J = . 1; j <n; j ++) printf ( " % d \ n " , d [ 0 ] [j]); 
    } 
    Volver  0 ; 
}

Resumen: El problema clave es el índice de este problema puede ser grande, por lo que no se puede resolver a través de la mitad de los más en circuito corto. Entonces, por el poder de maneras Seeking modulo rápido para solucionar el poder exponencial de una gran situación. Entonces el camino de módulo después del almacenamiento, y similares, y luego tratar de Dijkstra camino más corto, el resultado sigue siendo WA. Más tarde, cuando el blog de referencia a otras personas, encontró que las personas con potencia rápido + y comprobar de forma muy fácil de resolver el conjunto, la idea principal es: si dos puntos están ya en una colección, porque el lado de entrada de la parte posterior está aumentando, por lo ya no actualizado, si dos puntos en dos colecciones diferentes, a continuación, que el borde no está conectado a los dos conjuntos, la matriz de actualización de caminos, y conjunto entonces combinado.

Supongo que te gusta

Origin www.cnblogs.com/heyour/p/12636148.html
Recomendado
Clasificación