Este problema me recuerda muchos árboles de decisión. Consideraría este tipo de solución, que trata de elegir siempre el camino más prometedor, pero mirando todo el subgráfico:
Comenzando desde los nodos de sumidero, avance hacia las fuentes, un nivel a la vez. Mientras haces esto, dale peso a cada borde. Este peso debe representar la cantidad mínima que tendrá que "pagar" o "ganará" atravesando el subgráfico comenzando desde el nodo al que apunta el borde. Supongamos que estamos en el nivel i + 1 y estamos subiendo al nivel i. Esto es lo que haría para asignar un peso para un borde que apunta a un nodo de nivel i:
- edge_weight = señalando_nodo_peso.
- Encuentre el borde a partir del "nodo señalador" con el peso máximo. Deje que este peso sea next_edge_weight.
- edge_weight + = next_edge_weight
Luego, cree el orden de la siguiente manera:
- Sea S la frontera de búsqueda, es decir, el conjunto de nodos para seleccionar a continuación.
- Seleccione el nodo para que (node_weight + maximum_edge_weight) se maximice.
- Elimine el nodo del gráfico y S. Agregue los "hijos" del nodo a S.
- Si el gráfico no está vacío, vaya al paso 1.
- Detener.
La idea es atravesar esos subgrafos que darán la mayor ganancia posible primero, para poder soportar el costo de los subgrafos de peso negativo más tarde.