我说你可以修改Dijkstra's Algorithm做这个。您只需为传递的最后一个颜色的每个顶点存储一个额外的字段,以便当算法需要边的长度时,您可以在该边的颜色不等于最后传递的颜色时添加颜色税。然后,你必须更新该字段。这会在O(M + N log N)时间内完成。
编辑:随着伪代码:
1 function Dijkstra(Graph, source):
2 dist[source] ← 0
3
4 create vertex set Q
5
6 for each vertex v in Graph:
7 if v ≠ source
8 dist[v] ← INFINITY
9 prev[v] ← UNDEFINED
11 Q.add_with_priority(v, dist[v])
12
13 while Q is not empty:
14 u ← Q.extract_min()
15 for each neighbor v of u:
16 if color(prev[u], u) ≠ color(u, v)
17 alt = dist[u] + length(u, v) + colorTax
18 else
19 alt = dist[u] + length(u, v)
20 if alt < dist[v]
21 dist[v] ← alt
22 prev[v] ← u
23 Q.decrease_priority(v, alt)
24
25 return dist[], prev[]
原来,这与使用上一个场甚至没有需要一个新的领域。
交叉发表:http://cs.stackexchange.com/q/56688/755,http://stackoverflow.com/q/36808913/781723,http://mathoverflow.net/q/237582/37212 。请[不要在多个网站上发布相同的问题](http://meta.stackexchange.com/q/64068)。每个社区都应该诚实地回答问题,不要浪费任何人的时间。附:你遇到这种情况的背景是什么?这是一个编程竞赛的问题吗? –
我投票结束这个问题作为题外话,因为这是从这里交叉发布:http://cs.stackexchange.com/questions/56688/shortest-path-in-a-weighted-graph-with-彩色边缘 –