POJ 1251 Jungle Roads (título de la plantilla)

Los caminos de la selva
Tiempo límite: 1000MS   Límite de memoria: 10000K
Envíos totales: 27279   Aceptado: 12839

Descripción


El miembro jefe de la isla tropical de Lagrishan tiene un problema. Una explosión de dinero de la ayuda extranjera se gasta en carreteras adicionales entre los pueblos hace unos años. Pero la selva supera a las carreteras sin descanso, por lo que la gran red de carreteras es demasiado caro de mantener. El consejo de ancianos debe optar por dejar de mantener algunas carreteras. El mapa de arriba en todos los de la izquierda muestra los caminos en uso ahora y el costo en AACMS al mes para su mantenimiento. Por supuesto que tiene que haber alguna manera de conseguir entre todos los pueblos de caminos mantenidos, incluso si la ruta no es tan corto como antes. El anciano jefe le gustaría decirle al consejo de ancianos lo que sería la cantidad más pequeña que podría pasar en AACMS por mes para el mantenimiento de carreteras que conectarían todos los pueblos. Los pueblos están etiquetadas A a I en los mapas anteriores. El mapa de la derecha muestra los caminos que podrían mantenerse más barata, para 216 AACMS al mes. Su tarea es escribir un programa que va a resolver este tipo de problemas.

Entrada

La entrada consiste de uno a 100 conjuntos de datos, seguido por una línea final que contiene sólo 0. Cada conjunto de datos comienza con una línea que contiene sólo un número n, que es el número de aldeas, 1 <n <27, y los pueblos están etiquetados con los primeros n letras del alfabeto, en mayúsculas. Cada conjunto de datos se completa con n-1 líneas que comienzan con etiquetas pueblo en orden alfabético. No hay una línea para el último pueblo. Cada línea de un pueblo comienza con la etiqueta pueblo seguido de un número, k, de las carreteras de este pueblo a pueblos con etiquetas más adelante en el alfabeto. Si k es mayor que 0, la línea continúa con los datos para cada uno de los caminos k. Los datos de cada camino es la etiqueta del pueblo para el otro extremo del camino seguido por el costo de mantenimiento mensual en AACMS para el camino. Los costos de mantenimiento serán enteros positivos menos de 100. Todos los campos de datos en la fila están separados por espacios en blanco individuales. La red de carreteras siempre permitirá que los viajes entre todos los pueblos. La red no tendrá más de 75 carreteras. Ningún pueblo tendrá más de 15 carreteras de ir a otros pueblos (antes o después en el alfabeto). En la entrada de la muestra a continuación, el primer conjunto de datos va con el mapa de arriba.

Salida

La salida es un número entero por línea para cada conjunto de datos: el coste mínimo en AACMS al mes para mantener un sistema de carreteras que conectan todos los pueblos. Precaución: Una solución de fuerza bruta que examina cada posible conjunto de caminos no terminarán dentro del límite de tiempo de un minuto.

Ejemplo de entrada

9 
A 2 B 12 I 25 
B 3 C 10 H 40 I 8 
C 2 D 18 G 55 
D 1 E 44 
E 2 F 60 G 38 
F 0 
G 1 H 35 
H 1 I 35 
3 
A 2 B 10 C 40 
B 1 C 20 
0

Ejemplo de salida

216 
30

Ideas: el personaje se convierte en un entero, y luego aplicar la plantilla


a) bool check1 (int a) {return (a & (a - 1)) == 0? verdadero Falso; }

STD espacio de nombres el uso mismo 
par typedef <int, int> PII; 
typedef Long Long LL; 
const int = INF 0x3f3f3f3f; 
const int + 1E9 = MOD 7;. 
Const int MAXN = 1,005; 
const doble PI = ACOS (-1,0); 
const Doble . 8 = 1E-EPS; 

int VIS [1010]; // para 0 y 1 bandera que indica si se ha seleccionado este punto a través de la 
gráfica int [1010] [1010] ; // matriz de adyacencia para almacenar información de mapa 
dis int [1010 ]; // registrar la distancia desde cualquier punto al punto más cercano 
n- int, m, Minn, miniconector D, SUM; 
int Prim () 
{ 
    MEM (VIS, 0); 
    SUM = 0; 
    for (int i = 0; I <n- ; i ++) { 
        DIS [I] = Graph [0] [I]; 
        // << COUT DIS [I] << "-"; 
    } 
   // COUT << endl; 
    . VIS [0] = 1; // seleccionar el punto de partida  
    for (int i = 1; i <n;i ++)
    {
        Minn = INF; // tienda para encontrar el borde más pequeño 
        miniconector D = 0; // tienda de borde mínimo número de nodo 
        para (J = int 1;. J <n-; J ++) 
        { 
            IF (VIS [J] && DIS [J] <! borde mínimo nodo Minn) // iterar sobre los dis 
            { 
                Minn dis = [J]; 
                miniconector D = j; 
            } 
        } 
        SUM + = Minn; 
        VIS [miniconector D] = 1;. // representa encontraron 
    // ⑤ encuentra la más pequeña después de actualizar los DIS matriz nodo 
        para (. int 1 = J; J <n-; J ++) // actualizar la distancia mínima después de la inserción de un nuevo punto de 
        { 
            iF // borde cuando se añade, actualizado DIS (! VIS [J]) 
                DIS [J] min = (DIS [J], Graph [miniconector D] [J]); 
        } 
    } 
    volver SUM; 
} 
int main () {
    mientras que (~ scanf ( "% d", y n), n) { 
        mem (gráfica, INF); 
        for (int i = 0; i <n - 1; i ++) { 
            Char u; 
            t int; 
            scanf ( "% c% d", & u, y t); 
            while (t--) { 
                Char v; //景区
                int w; //边权值
                scanf ( "% c% d", & v, y w); 
                gráfico [i] [v - 'A'] = gráfico [v - 'A'] [i] = w; //建图
            } 
        } 
        printf ( "% d \ n", prim ()); 
    } 
    Return 0; 
}

  

Supongo que te gusta

Origin www.cnblogs.com/AlexLINS/p/12657472.html
Recomendado
Clasificación