Esse problema me lembra muitas árvores de decisão. Eu consideraria esse tipo de solução, que tenta sempre escolher o caminho mais promissor, mas olhando para todo o subgráfico:
A partir dos nós do coletor, trabalhe em direção às fontes, um nível de cada vez. Enquanto você faz isso, dê um peso a cada borda. Esse peso deve representar o valor mínimo que você terá que "pagar" ou "ganhará" atravessando o subgráfico a partir do nó para o qual a borda aponta. Suponha que estejamos no nível i + 1 e subamos para o nível i. Isto é o que eu faria para atribuir um peso para uma borda apontando para um nó do nível i:
- edge_weight = apontar_nome_peso.
- Encontre a borda começando no "nó apontador" com o peso máximo. Deixe esse peso ser next_edge_weight.
- edge_weight + = next_edge_weight
Em seguida, crie a ordem da seguinte maneira:
- Seja S a fronteira da pesquisa, ou seja, o conjunto de nós para selecionar a seguir.
- Selecione o nó para que (node_weight + maximum_edge_weight) seja maximizado.
- Remova o nó do gráfico e S. Adicione os "filhos" do nó a S.
- Se o gráfico não estiver vazio, vá para a etapa 1.
- Pare.
A idéia é atravessar os subgráficos que darão o maior ganho possível primeiro, para poder suportar o custo dos subgráficos de peso negativo posteriormente.