Module: Patrones en Programación Dinámica - 2


Problem

4 /5


Enano

Theory Click to read/hide

Descargo de responsabilidad: el método que se describe a continuación no es universal, pero a menudo puede resolver un problema o ayudarlo a encontrar la solución correcta.

Si necesita verificar la existencia de una permutación en un problema, o encontrar el número de permutaciones que coinciden, o algo similar, entonces debería considerar usar la programación dinámica de subconjuntos.

El parámetro principal será una máscara de bits, que mostrará qué elementos ya se han incluido en la permutación y cuáles no. También suele ser necesario un segundo parámetro que indique qué elemento se incluyó en último lugar.

A menudo, las permutaciones se pueden ver en el contexto de las rutas en los gráficos. En consecuencia, consideremos un ejemplo clásico: el problema del camino hamiltoniano.
Un camino hamiltoniano es un camino simple que pasa por cada vértice del gráfico exactamente una vez. Se puede representar simplemente como una permutación de longitud n, donde n es el número de vértices. El orden dentro de esta permutación indicará el orden en que se recorren los vértices de este camino.

Para verificar la presencia de un camino hamiltoniano en el gráfico, comencemos con la dinámica dp[máscara][último]: ¿hay un camino simple que pase por alto los vértices marcados con unos en la máscara de bits y termine en el último vértice?
Los valores iniciales serán dp[2i][i] = verdadero, el resto falso, lo que significa que siempre hay un camino vacío que comienza en cualquiera de los vértices.
Teniendo el valor true en dp[mask][last] haremos transiciones hacia adelante, en el sentido de "extender el camino". Es decir, buscaremos el número de vértices que están marcados con cero en la máscara (aún no los hemos visitado en el camino) y al mismo tiempo tal que haya una arista desde el último hasta este vértice (el camino debe extenderse por un borde existente). Es decir, hacemos dp[mask | 2k][k] = verdadero si dp[máscara][último] = verdadero Y máscara & 2k = 0 (el vértice k aún no ha sido visitado) Y hay una última arista -> k.
En última instancia, existe una ruta hamiltoniana si hay un valor verdadero en dp para los parámetros de la máscara de bits de todos unos y cualquier último vértice.

Problem

Una vez, el enano Quark se encontró con un mapa del tesoro. Hay N puntos marcados en el mapa donde se puede encontrar el tesoro. Todos los puntos están numerados del 1 al N. Para cada par de puntos, Quark conoce la longitud del camino que los une. Quark inicia su búsqueda desde el punto número 1. Antes de emprender su largo viaje, el astuto enano tacha puntos donde, a su juicio, no puede haber tesoro. Se garantiza que el punto número 1 nunca se tacha. Después de eso, Quark elige una ruta que pasa por todos los puntos restantes del mapa. La ruta no pasa por el mismo punto más de una vez. Un quark solo puede caminar por caminos que conectan puntos no cruzados.

Quark quiere elegir una ruta de longitud mínima. Es necesario encontrar tal ruta para Quark.

Entrada
La primera línea contiene un número entero N (1 ≤ N ≤ 15) — el número de puntos marcados en el mapa. Las siguientes N líneas contienen las distancias entre los puntos. La (i+1)-ésima línea contiene N enteros di1,di2, diN — longitudes de caminos desde el i-ésimo punto hasta todos los demás. Se garantiza que dij=dji, dii=0 y 0 <dij < 100 La (N+2)-ésima línea contiene un número entero Q (1 < Q ≤ 1000) — el número de opciones para eliminar puntos de este mapa. Las siguientes líneas Q contienen una descripción de las opciones de eliminación. La descripción comienza con el número C (0 ≤ C < N) — el número de puntos donde, según Quark, no puede estar el tesoro. Los siguientes números C dan los números de estos puntos.

Impresión
Imprimir líneas Q. En cada línea, imprime un número entero — la longitud de la ruta mínima con la correspondiente opción de borrado de puntos.
Ejemplos
# Entrada Salida
1 3
0  45 10
45 0  30
10 30 0
2
0
1 3
40
45
2 5
0  14 20 17 14
14 0  15 19 18
20 15 0  15 16
17 19 15 0  14
14 18 16 14 0
2
3 5 4 3
0
14
58