2015-06-03 2 views
2

У меня есть ориентированный ациклический граф с взвешенными краями. Моя цель - найти сумму произведений ребер во всех путях между «первым» и «последним» уровнями. Например, в этом случае это будет 2 * 3 + 2 * 1 + 4 * 2 + 4 * 4 + 3 * 3 + 3 * 1 + 2 * 2 + 2 * 4 = 56. На реальном графе у меня есть 20-30 уровней. Есть ли эффективный способ сделать это?Сумма произведений краев всех путей в DAG

Graph

ответ

1

Попробуйте динамического программирования - начиная с последнего уровня и идти в обратном направлении. Для каждого узла v вычислите сумму S [v] для путей от этого узла до последнего уровня.

Для последнего уровня этот S [v] = 0 для всех v. Если у вас есть S [v] для всех узлов уровня i + 1, то вы вычисляете для всех узлов уровня i: S [u] = sum {v, st (u, v) является весом ребра (u, v) * S [v].

+0

сделать решение DP вы должны сделать 'топологический sort' на графике, чтобы определить уровни вашего графика. лучше просто запустить 'DFS' на графике и вычислить productSum в realTime. –

+0

Да, ты прав. –

+0

Это на самом деле отлично работает для моих целей, так как все мои графики имеют абсолютно схожую структуру. Благодарю. –

2

Вы можете использовать простой DFS, чтобы решить эту проблему:

Node s; // starting node 
    Integer result = 0 
    Function sumProduct(Node currentNode){ 
      mark currentNode as visited 
      for each connected node to currentNode which is not visited do 

       result += edgeCost(currentNode to neighbor) + sumProduct(Neighbor); 
      end for 

       return result 
    } 

// call function with the starting node: 

sumProduct(s);