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