Cómo resolver http://www.spoj.com/problems/TRAFFICN/ de spoj

La pregunta dada es una modificación del algoritmo de Dijkstra. Primero calcule las longitudes de camino más cortas de todos los vértices desde los vértices de origen utilizando el algoritmo de Dijkstra de origen único.

Deje que dist [u] [0] sea la distancia más corta desde s hasta el vértice u.

Ahora, cuando agrega un borde ab de dos vías en el gráfico, la ruta más corta de s a t podría cambiar. Si b estuviera en la ruta más corta de s a t, entonces

d [t] [0] = d [b] [0] + distancia más corta (b, t)

Al agregar el borde ab

Diga d1 = min (d [b] [0], d [a] [0] + longitud de borde (a, b)) + distancia más corta (b, t)

Del mismo modo, a también puede estar en el camino más corto de sa t

Diga d2 = min (d [a] [0], d [b] [0] + longitud de borde (b, a)) + distancia más corta (a, t)

Si el mínimo entre d1 y d2 es menor que d [t] [0], actualice el valor de respuesta y verifique lo anterior para todos los bordes ab

Y para la distancia más corta (b, t), no es necesario volver a aplicar el Algoritmo de Dijkstra (dará TLE incluso si lo hace). Así que precalcule estos valores aplicando el Algoritmo de Dijkstra en el gráfico invertido y con el vértice inicial como t.

Divida cada nodo [matemática] v [/ matemática] en dos nodos [matemática] v_0, v_1 ​​[/ matemática]. Si ya hay un borde de [math] u [/ math] a [math] v [/ math] para dos nodos originales [math] u, v \ en V [/ math], entonces también debería haber un borde de [math ] u_0 [/ matemática] a [matemática] v_0 [/ matemática] y de [matemática] u_1 [/ matemática] a [matemática] v_1 [/ matemática]. Además, para cada camino propuesto [matemática] (u, v) [/ matemática] de longitud [matemática] q [/ matemática], agregue un borde desde [matemática] u_0 [/ matemática] a [matemática] v_1 [/ matemática] de longitud [matemática] q [/ matemática]. Esto garantiza que solo se pueda usar una carretera propuesta; usarla lo lleva de la “capa” 0 a la “capa” 1, de la cual no hay más carreteras propuestas. El vértice fuente es [matemática] s_0 [/ matemática] y la respuesta correcta es la distancia al más cercano de [matemática] t_0 [/ matemática] o [matemática] t_1 [/ matemática] según si se utiliza o no un camino propuesto .

More Interesting

¿Cuál es el mejor algoritmo de clasificación manual? Por ejemplo, si tuviera una pila de papeles que quisiera ordenar alfabéticamente, ¿cuál sería la forma más eficiente de hacerlo? ¿Qué pasaría si estuvieras de acuerdo con que uno o dos se alejen de su posición ordenada?

¿Se puede usar la GPU para optimizar los algoritmos gráficos?

¿Cómo se creó el 'algoritmo' de la evolución biológica?

¿Puedes pensar en dos situaciones en las que usarías listas vinculadas?

¿Por qué usarías una cola en lugar de una lista vinculada? ¿No es una cola una versión peor de una lista vinculada?

¿La informática es solo sobre programación y algoritmos?

¿La democratización de los algoritmos de aprendizaje automático es una bendición o un peligro para los profesionales no expertos?

¿Cuál es un problema que no se puede resolver en tiempo de EXP pero se puede resolver en tiempo de Tetración?

¿Cuál es la mejor manera de ordenar un terabyte de matriz de datos, cuando tiene RAM limitada (500k), y cada elemento de la matriz tiene un par de elementos de datos, de aproximadamente 1-10k cada uno?

¿Qué son los algoritmos de compresión de datos?

En la programación de computadoras, ¿es cierto que una recursión funcionará mejor para encontrar todas las rutas posibles que los bucles anidados?

¿Existe algún enlace de los algoritmos o técnicas más utilizados en la programación competitiva?

¿Cuál es el libro correcto para comprar algoritmos de Amazon y para alguien que no tiene idea sobre el algoritmo?

¿Cuál es la relación entre los algoritmos y las IA (modernas)?

¿Cómo se diseña el algoritmo de búsqueda difusa en Sublime Text? ¿Cómo diseñarías algo similar?