2010-03-26 19 views

Respuesta

21

Dynamic programming. También se hace referencia en Longest path problem, dado que es un DAG.

El siguiente código de Wikipedia:

algorithm dag-longest-path is 
    input: 
     Directed acyclic graph G 
    output: 
     Length of the longest path 

    length_to = array with |V(G)| elements of type int with default value 0 

    for each vertex v in topOrder(G) do 
     for each edge (v, w) in E(G) do 
      if length_to[w] <= length_to[v] + weight(G,(v,w)) then 
       length_to[w] = length_to[v] + weight(G, (v,w)) 

    return max(length_to[v] for v in V(G)) 
+1

Esto devuelve solo la longitud de la ruta. ¿Se puede modificar fácilmente el código para devolver el camino? – oschrenk

+1

Sí, de la misma manera con la mayoría de los problemas de DP: haga un seguimiento de lo anterior y vuelva a encenderlo. – Larry

+2

'topOrder (G)' es la lista de vértices de G en [orden topológico] (https://en.wikipedia.org/wiki/Topological_sorting) –

4

Mientras el grafo es acíclico, todo lo que tiene que hacer es negar los pesos de las aristas y ejecutar cualquier algoritmo de ruta más corta.

EDITAR: Obviamente, necesita un algoritmo de ruta más corta que admita contrapesos negativos. Además, el algoritmo de Wikipedia parece tener una mejor complejidad de tiempo, pero dejaré mi respuesta aquí para referencia.

+0

y mantenemos los pesos negativos como negativos? : p – Hellnar

+0

@Hellnar: no, si tienes pesos negativos en el gráfico original, deberían ser positivos. w '= - (w) –

1

puede ser resuelto por el método de la ruta crítica:
1. Encontrar un ordenamiento topológico
2. encuentre la ruta crítica
vea [Horowitz 1995], Fundamentos de las estructuras de datos en C++, Computer Science Press, Nueva York.

La estrategia codiciosa (por ejemplo, Dijkstra) no funcionará, sin importar: 1. use "max" en lugar de "min" 2. convierta los pesos positivos a negativos 3. dé un número muy grande M y use M-w como peso.

Cuestiones relacionadas