使用DFS找到从s到t的最昂贵路径

时间:2016-09-12 11:48:36

标签: algorithm graph-theory depth-first-search

在给定的图表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

我们不想过去。你怎么看?我的方法是否正确?

1 个答案:

答案 0 :(得分:0)

不幸的是,这个问题是NP-Complete。证明是通过简单减少最长路径问题https://en.wikipedia.org/wiki/Longest_path_problem来实现的。

证明:
如果假设我们有一个可以在多项式时间内解决问题的算法。这是找到两个节点之间最长的路径s&amp; t。然后,我们可以为每对节点应用此算法(O(n ^ 2)次),并在多项式时间内获得最长路径问题的解。

如果一个简单但非常低效的算法就足够了,那么您可以调整DFS算法,以便在每个节点上,以所有置换顺序执行其相邻节点的DFS。跟踪每个订单的最低成本。