我說你可以修改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-彩色邊緣 –