在给定的图表G=(V,E)
中,每个边缘的费用为c(e)
。我们有一个起始节点s和一个目标节点t。我们如何使用以下DFS算法找到从s到t的最昂贵的路径?
DFS(G,s):
foreach v in V do
color[v] <- white; parent[v] <- nil
DFS-Visit(s)
DFS-Visit(u)
color[u] <- grey
foreach v in Adj[u] do
if color[v] = white then
parent[v] = u; DFS-Visit(v)
color[u] <- black
我尝试过:
首先,我们创建一个数组来维持每个节点的成本:
DFS(G,s,t):
foreach v in V do
color[v] <- white; parent[v] <- nil; cost[v] <- -inf
DFS-Visit(s,t)
return cost[t]
第二,我们仍然应该访问节点事件,如果它是灰色的以更新其成本:
DFS-Visit(u,t)
color[u] <- grey
foreach v in Adj[u] do
if color[v] != black then
parent[v] = u;
if cost[u] < cost[v] + c(u,v) then
cost[v] = cost[v] + c(u,v)
if t != v then
DFS-Visit(v)
color[u] <- black
我们不想过去。你怎么看?我的方法是否正确?
答案 0 :(得分:0)
不幸的是,这个问题是NP-Complete。证明是通过简单减少最长路径问题https://en.wikipedia.org/wiki/Longest_path_problem来实现的。
证明:
如果假设我们有一个可以在多项式时间内解决问题的算法。这是找到两个节点之间最长的路径s
&amp; t
。然后,我们可以为每对节点应用此算法(O(n ^ 2)次),并在多项式时间内获得最长路径问题的解。
如果一个简单但非常低效的算法就足够了,那么您可以调整DFS算法,以便在每个节点上,以所有置换顺序执行其相邻节点的DFS。跟踪每个订单的最低成本。