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

Find the most expensive path from s to t using DFS

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

而且我们不想通过 t。你怎么看?我的做法正确吗?

不幸的是,这个问题是 NP 完全的。证明是将最长路径问题 https://en.wikipedia.org/wiki/Longest_path_problem 简单地简化为这个。

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

如果一个简单但效率极低的算法就足够了,那么您可以调整 DFS 算法,以便在每个节点上,以 所有排列顺序 对其相邻节点进行 DFS。跟踪每个订单获得的最低成本。