Este es un desafío que originalmente fue un gusto para el Bundeswettbewerb Informatik alemán (competencia federal de informática [?]), Una competencia para estudiantes de secundaria. A diferencia de la pregunta original, donde tienes que encontrar una buena solución y escribir alguna documentación, quiero que juegues al golf. Intento replicar la pregunta lo mejor posible:
Desafío
Muchas ciudades en Europa tienen las llamadas ciudades gemelas . Este año, hay un Jubileo especial donde cada par de ciudades gemelas en la UE organiza un festival para celebrar su asociación. Para garantizar que ninguna ciudad tenga que organizar demasiados festivales, cada ciudad tiene un límite de festivales que puede organizar. ¿Es posible distribuir los festivales entre las ciudades gemelas de tal manera que cada par de ciudades gemelas organice un festival en una de las dos ciudades y ninguna ciudad organice más festivales de los que está permitido? En caso afirmativo, explique cómo.
Este es un mapa de algunas ciudades, sus asociaciones y sus límites de festivales.
asociaciones http://dl.dropbox.com/u/1869832/partnerships.png
Requisitos
- Su programa debe resolver el problema en un minuto cada uno para ambos casos de prueba. (Vea abajo)
- Consulte los casos de prueba para el formato de entrada.
El resultado debe estar vacío si no existe una solución y, de lo contrario, debe tener el siguiente formato: una línea para cada par de ciudades gemelas,
a
sicity1
organiza el festival, de lob
contrario.<city1>, <city2>, <a/b>
La solución con el menor número de caracteres que satisfaga los requisitos gana. En caso de empate, el programa que se presentó primero gana.
- Se aplican las reglas habituales de código de golf.
Casos de prueba
La tarea original tenía dos casos de prueba. Los he subido a github .
fuente
n
nodos, donden
está el límite presupuestario de la ciudad).Respuestas:
Python, 380 caracteres
Este código utiliza un algoritmo de flujo máximo de estilo push-relabel .
N[x]
es la cantidad de partes permitidas enx
,X[x]
es la lista de ciudades asociadas actualmente programadas para hospedar enx
(que puede ser más larga queN[x]
durante el algoritmo), yH[x]
es la altura etiquetada dex
. Para cualquier ciudad con exceso de suscripción, empujamos una de sus fiestas programadas a una ciudad asociada más baja o aumentamos su altura.fuente
C #,
1016992916caracteresMe toma 4 segundos en el conjunto de prueba grande; el rendimiento se puede mejorar fácilmente haciendo
X
un enHashSet<s>
lugar de unList<s>
.Esto utiliza la reducción al flujo máximo que indiqué anteriormente en los comentarios. Los vértices son
S
y un sumidero recién generadosT
.Los bordes son
El algoritmo es Ford-Fulkerson con DFS. Es obvio a priori que cada ruta de aumento aumentará el flujo en 1, por lo que la optimización de golf para eliminar el cálculo del flujo de la ruta no tiene ningún efecto negativo en el rendimiento.
Hay otras posibles optimizaciones haciendo suposiciones como "Los nombres de los archivos de entrada nunca serán los mismos que los nombres de las ciudades", pero eso es un poco dudoso en mi opinión.
fuente