Dijkstra's algorithm with negative weights

后端 未结 7 1430
有刺的猬
有刺的猬 2020-11-30 01:06

Can we use Dijkstra\'s algorithm with negative weights?

STOP! Before you think \"lol nub you can just endlessly hop between two points and get an in

7条回答
  •  一向
    一向 (楼主)
    2020-11-30 01:36

    There is actually an algorithm which uses Dijkstra's algorithm in a negative path environment; it does so by removing all the negative edges and rebalancing the graph first. This algorithm is called 'Johnson's Algorithm'.

    The way it works is by adding a new node (lets say Q) which has 0 cost to traverse to every other node in the graph. It then runs Bellman-Ford on the graph from point Q, getting a cost for each node with respect to Q which we will call q[x], which will either be 0 or a negative number (as it used one of the negative paths).

    E.g. a -> -3 -> b, therefore if we add a node Q which has 0 cost to all of these nodes, then q[a] = 0, q[b] = -3.

    We then rebalance out the edges using the formula: weight + q[source] - q[destination], so the new weight of a->b is -3 + 0 - (-3) = 0. We do this for all other edges in the graph, then remove Q and its outgoing edges and voila! We now have a rebalanced graph with no negative edges to which we can run dijkstra's on!

    The running time is O(nm) [bellman-ford] + n x O(m log n) [n Dijkstra's] + O(n^2) [weight computation] = O (nm log n) time

    More info: http://joonki-jeong.blogspot.co.uk/2013/01/johnsons-algorithm.html

提交回复
热议问题