recorrido porque pesos pasos negativos metodo matematicas mas funciona ford dykstra discretas corto con búsqueda bellman algoritmos algoritmo algorithm data-structures graph shortest-path dijkstra

algorithm - porque - gráfico-Camino más corto con peso de vértice



metodo bellman ford (2)

El peso del vértice se puede eliminar cortando cada vértice a en dos vértices a1 y a2 con un borde de a1 a a2 con el peso de a.

Creo que tienes razón para la adaptación del algoritmo de dijkstra.

Aquí hay un impuesto especial:

En ciertos problemas de gráficos, los vértices pueden tener pesos en lugar de, o además de los pesos de los bordes. Sea Cv el costo del vértice v, y C (x, y) el costo del borde (x, y). Este problema tiene que ver con encontrar la ruta más barata entre los vértices a y b en un gráfico G. El costo de una ruta es la suma de los costos de los bordes y vértices encontrados en la ruta.

(a) Suponga que cada borde en el gráfico tiene un peso de cero (mientras que los no bordes tienen un costo de). Suponga que Cv = 1 para todos los vértices 1≤v≤n (es decir, todos los vértices tienen el mismo costo) . Ofrezca un algoritmo eficiente para encontrar la ruta más económica de aab y su complejidad de tiempo.

(b) Ahora suponga que los costos de vértice no son constantes (pero son todos positivos) y que los costos de borde se mantienen como se indicó anteriormente. Ofrezca un algoritmo eficiente para encontrar la ruta más económica de aab y su complejidad de tiempo.

(c) Ahora suponga que los costos de borde y vértice no son constantes (pero todos son positivos). Ofrezca un algoritmo eficiente para encontrar la ruta más económica de aab y su complejidad de tiempo.

Aquí está mi respuesta:

(a) usar BFS normal;

(b) Use el algoritmo de dijkstra, pero reemplace el peso con el peso del vértice;

(do)

También usa el algoritmo de dijkstra.

Si solo consideramos el peso del borde, entonces para la parte clave del algoritmo de dijkstra, tenemos:

if (distance[y] > distance[v]+weight) { distance[y] = distance[v]+weight; // weight is between v and y }

Ahora, considerando el peso del vértice, tenemos:

if (distance[y] > distance[v] + weight + vertexWeight[y]) { distance[y] = distance[v] + weight + vertexWeight[y]; // weight is between v and y }

Estoy en lo cierto?

Supongo que mi respuesta a (c) es demasiado simple, ¿verdad?


Usted está en el camino correcto y la solución es muy simple.

Tanto en B, C, reduzca el problema a dijkstra normal, que no asume ningún peso en los vértices.
Para esto, deberá definir w'':E->R , una nueva función de peso para los bordes.

w''(u,v) = w(u,v) + vertex_weight(v)

en (b) w(u,v) = 0 (o const), y la solución es robusta para encajar (c) también!

La idea subyacente es usar un borde que le cueste el peso del borde y el costo de alcanzar el vértice objetivo. El costo de la fuente ya se pagó, por lo que no tiene en cuenta 1 .

¡Reducir un problema, en lugar de cambiar un algoritmo suele ser mucho más fácil de usar, probar y analizar!

(1) En esta solución, "pierde" el peso de la fuente, por lo que el camino más corto de s a t será: dijkstra(s,t,w'') + vertex_weight(s)_ [donde dijkstra(s,t,w'') es la distancia desde s hasta t usando w''