我刚看到一个问题的解决方案,修改Dijkstra以获得最大K色边缘的最短路径。我想知道如果我们想找到带有彩色节点而不是边缘的最短路径,我们如何修改Dijkstra才能做到这一点?
我想到的是,在Dijkstra之上,我添加一个整数变量,比方说我。然后创建一个映射来记录到达那里需要多少个彩色节点,如果有一种方法通过颜色较少的节点,则更新它。我们将采用最少彩色节点的路径。但这似乎有些不对劲,有什么建议吗?
Algorithm Dijkstra ( G , s in V(G), c(v) in{black, white}, K )
1. for each vertex u in V(G) do dist[u] <- +infinity
2. dist[s] <- 0 ; p[s] <- null
3. c(s)=black? r <- 1 : r <- 0
4. Q <- ConstructMinHeap(V(G), dist)
5. M <- Map(s, r)
6. while Q != null do
7. u <- DeleteMin(Q)
8. for each v in Adj[u] do
9. if M.value(u) is null then do
10. M <- Map(u, M.value(v) + c(u)=black? 1 : 0)
11. else
12. M.value(u) < (M.value(v) + c(u)=black? 1 : 0)? Update : do nothing
13. end-if
14. if dist[v] > dist[u] + w(u,v) and M.value < K then do
15. dist[v] <- dist[u] + w(u,v)
16. p[v] <- u
17. UpHeap(v,Q)
18. end-if
19. end-for
20. end-while
end
答案 0 :(得分:0)
如果使用优先级队列对选项进行排名,请考虑使用到目前为止的距离和通过的彩色节点数来确定优先级顺序。通过这种方式,您可以使用传统的Dijkstra,并根据您的优先级排名来确定最小路径。