Ця проблема нагадує мені багато дерев рішень. Я б розглядав такий тип рішення, який намагається завжди вибрати найбільш перспективний шлях, але дивлячись на весь підграф:
Починаючи з вузлів раковини, просувайтесь до джерел, один за одним. Поки ви робите це, надайте кожному краю вагу. Ця вага повинна представляти мінімальну суму, яку вам доведеться "заплатити", або ви "наберетеся", пройшовши підграф, починаючи від вузла, на який вказує край. Припустимо, ми перебуваємо на рівні i + 1 і рухаємось до рівня i. Це я б зробив, щоб призначити вагу для краю, що вказує на вузол рівня i:
- edge_weight = вказівний_node_weight.
- Знайдіть край, починаючи з "вказівного вузла" з максимальною вагою. Нехай ця вага буде next_edge_weight.
- edge_weight + = next_edge_weight
Потім побудуйте порядок наступним чином:
- Нехай S - межа пошуку, тобто набір вузлів, які слід вибрати з наступного.
- Виберіть вузол так, щоб (node_weight + maks_edge_weight) був максимальним.
- Видаліть вузол із графіка і S. Додайте «діти» до вузла S.
- Якщо графік не порожній, перейдіть до кроку 1.
- Зупинка.
Ідея полягає в тому, щоб перейти на ті підграграфи, які дадуть якомога більше виграшів, щоб потім нести витрати на підграграфи з негативною вагою пізніше.