Cómo resolver este problema particular de programación dinámica ACM-ICPC

Tomar cualquiera de las rutas dadas es equivalente a eliminar cada nodo en la ruta. Entonces deberíamos ordenarle al árbol que realice estas eliminaciones. Por lo general, en problemas de árbol, atraviesa árboles subterráneos y, en este caso, puede intentar eliminar (u omitir) rutas que comienzan desde una raíz arbitraria que baja hasta las hojas. Para considerar las rutas exactamente una vez, solo considere cada ruta en su nodo más alto, es decir, el ancestro común más bajo. Luego, el problema se reduce a un problema de programación dinámica y estructura de datos que se puede resolver de abajo hacia arriba, tratando los subárboles como subproblemas. Es necesaria una optimización final, utilizando un árbol indexado binario y alguna otra precomputación, ya que los límites son altos. Este último paso es bastante trivial para el código, pero he dado la mayor parte de la intuición detrás de la solución.

Pensé que este era un problema bastante bueno, así que escribí una solución que AC: Envíos. Hay muchos tecnicismos para este problema (depurar este código es difícil), lo que explica por qué nadie lo intentó / resolvió.

A mi entender, este es un problema estándar de flujo de red ‘reducido’. El problema original se plantea como ‘rutas disjuntas máximas en un gráfico no dirigido dado’ que al aplicar el paradigma de reducción se convierte en el flujo máximo en el flujo de red con cada peso de borde igual a 1.

Afortunadamente aquí, dado que este es un árbol, eliminando el nodo de origen y el nodo de destino una ruta disjunta en el gráfico == una ruta sin nodo compartido en este árbol (piénselo).

Entonces, el problema se reduce a encontrar el flujo máximo en una red. Aplique el algoritmo Ford-Fulkerson / ED-KA (las implementaciones estándar deberían estar allí) para obtener la solución. Una vez que tenga los caminos, puede aplicar los pesos de borde reales y obtener el peso máximo de borde.

More Interesting

¿En qué se diferencia la informática de las matemáticas para resolver un problema?

¿Cuál es el orden de las operaciones para la notación sigma?

¿Ya se resolvió P versus NP? ¿Si es así, cómo?

¿Es necesario asumir que una distribución de claves para el hashing para trabajar con O (1) garantiza que sí lo tiene?

¿Los problemas informáticos de tipo nQueens tienen aplicaciones en física, en particular en la teoría de la materia condensada?

¿Cuándo requerimos hacer una transformación no lineal o reducción de dimensiones como el kernel PCA?

¿Cuáles son algunos ejemplos de pruebas matemáticas que contradicen las expectativas?

¿Cómo calculo la probabilidad de que alguien compre mi spray de calvicie?

¿Qué es un algoritmo para convertir de una lista de adyacencia a una matriz de incidencia?

Cómo escribir un programa en C para verificar si para cualquier triplete entero (x, y, z) y otro entero n, [matemática] n ^ x + n ^ y = n ^ z [/ matemática] ocurre para (a, b) siendo la entrada donde [matemáticas] a \ leq n \ leq b [/ matemáticas]

¿Por qué la teoría de la medida es más común en economía que en informática?

Tienes 25 caballos y quieres elegir los 3 caballos más rápidos de esos 25. En cada carrera, solo 5 caballos pueden correr al mismo tiempo porque solo hay 5 pistas. ¿Cuál es el número mínimo de carreras requeridas para encontrar los 3 caballos más rápidos sin usar un cronómetro?

¿Para qué sirve la función explotar ()?

Cómo resolver la Competencia de Computación Canadiense de 1996, Etapa 1, Problema C (vea el enlace del problema a continuación)

¿Es la matemática pura esencial para la informática teórica?