Эта проблема напоминает мне много деревьев решений. Я хотел бы рассмотреть этот тип решения, который пытается всегда выбрать наиболее многообещающий путь, но, глядя на весь подграф:
Начиная с приемных узлов, продвигайтесь к источникам, по одному уровню за раз. В то время как вы делаете это, придавайте каждому краю вес. Этот вес должен представлять минимальную сумму, которую вам придется «заплатить», иначе вы «заработаете», пройдя подграф, начиная с узла, на который указывает край. Предположим, мы находимся на уровне i + 1 и продвигаемся до уровня i. Вот что я бы сделал, чтобы назначить вес ребру, указывающему на узел уровня i:
- edge_weight = указывающий_узел_вес.
- Найти ребро, начиная с «указывающего узла» с максимальным весом. Пусть этот вес будет следующим.
- edge_weight + = next_edge_weight
Затем создайте порядок следующим образом:
- Пусть S будет границей поиска, то есть набором узлов для выбора из следующего.
- Выберите узел так, чтобы (node_weight + maximum_edge_weight) был максимальным.
- Удалите узел из графа и S. Добавьте «детей» узла в S.
- Если график не пустой, перейдите к шагу 1.
- Halt.
Идея состоит в том, чтобы обойти те подграфы, которые сначала дадут как можно больше выигрыша, чтобы потом иметь возможность нести стоимость подграфов с отрицательным весом.