Cómo modificar Floyd Warshall para resolver Codeforces # 179 Div.1 B Greg y Graph

Básicamente, debe tener una buena comprensión de cómo está diseñado y funciona el algoritmo de Floyd.

El algoritmo de Floyd mantiene un conjunto de vértices V. Comienzas por un conjunto vacío, luego cada vez que agregas un vértice, actualizas todos los caminos más cortos actuales a través de él. Sigue agregando vértices nuevos uno por uno hasta que termina con el conjunto de vértices originales completo. Digamos que nuestro conjunto de vértices original se llama V, y el que seguimos creciendo es F.

Sea V = {1,2,3,4,5}

Después del primer paso en Floyd, la cardinalidad de F sería 1. (por ejemplo, {1}).

Luego, después de 5 pasos, terminaría con el conjunto V. No importa en qué orden estaba agregando los vértices. Como estaba actualizando la ruta más corta después de cada adición, terminaría con todas las rutas más cortas del par. Puede analizar más el algoritmo si no está claro.

Ahora nos gustaría modificar lo siguiente para el problema, sin embargo, en el problema en cada consulta estamos eliminando un vértice, entonces, ¿cómo podríamos solucionar esto?

Consigamos todos los caminos más cortos entre vértices que no están involucrados en la consulta. Ejecute floyd pero no permita que se agreguen estos vértices al conjunto F.

Una vez que hayas terminado, ahora te gustaría resolver el resto, pero cada vez que eliminamos un vértice, ¿qué podemos hacer?

¡Añade los vértices en orden inverso! Digamos que nuestra consulta es 1 2 3.

Cuando permitimos 3, estamos obteniendo los caminos más cortos sin 2 y 1. Permitamos 2, estamos obteniendo los caminos más cortos sin 1.

El resto es cómo implementaría el algoritmo y bloquearía los vértices de manera eficiente.

More Interesting

¿Vale la pena tomar el curso de Algoritmos de Udacity?

¿Por qué chupo la programación (algoritmos de programación dinámica en particular)?

Si tengo un buen conocimiento de Java, C ++, algoritmos y estructuras de datos y quiero ser un profesional independiente. ¿Cuánto puede ganar alguien con estas habilidades?

¿Cuáles son los planes generales para los algoritmos de divide y vencerás?

¿Por qué utilizan la factorización principal para el cifrado en lugar de un algoritmo que hemos demostrado que es difícil de resolver?

Cómo definir una estructura de datos de gráfico dinámico en C ++ (un gráfico que tiene un número desconocido de vértices)

¿Por qué la búsqueda de Breadth-first (y otros algoritmos relacionados) se consideran parte del campo de IA?

¿Se introdujo la recursión a propósito?

¿Es mejor hacer InterviewBit ahora (actualmente estoy en mi quinto semestre) o hacer SPOJ ahora y luego hacer InterviewBit solo 3 o 4 meses antes de las entrevistas? Solo conozco algunas estructuras de datos y algoritmos básicos. He hecho 40 problemas en SPOJ.

¿Cuál es la mejor manera de aprender algoritmos de informática?

¿Qué es la clasificación interna y la clasificación externa?

¿Qué estructuras de datos y algoritmos deben conocer todos los estudiantes de ciencias de la computación / ingeniería?

Cómo calcular óptimamente grandes factoriales de orden 10 ^ 5 para operaciones repetidas (por ejemplo, encontrar permutaciones)

¿Cómo afectan los nuevos algoritmos de Instagram a la búsqueda de hashtag?

Si arr es una matriz de enteros, ¿por qué la expresión ar ++ no es legal?