如何找到访问树中所有选定节点的最短路径?

时间:2017-04-28 02:38:53

标签: java c# algorithm

我知道有很多类似的寻路问题,我对Dijkstra的算法有一个简要的了解。但我遇到了这个问题,我已经到了这里,我相信这不是那么直截了当。让我解释它是如何成为第一个:

我有一棵树代表一个探索的路径图。如果我用Java / C#语法编写路径节点类,它将如下所示。 (注意:移动到另一个节点需要花费)

class Path {
    Path parent;
    Path north;
    int costToNorth;
    Path east;
    int costToEast;
    Path south;
    int costToSouth;
    Path west;
    int costToWest;
}

想象一下这样的树:

[root] Node A
    [north] Node B
        [north] Node F
        [east]  Node G
            [north]  Node H
    [east]  Node C
        [east]  Node I
            [north] Node N
            [east]  Node O
        [south] Node J
    [south] Node D
        [south] Node K
            [east]  Node P
            [south] Node Q
    [west]  Node E
        [south] Node L
        [west]  Node M

如果我有一组必须访问的节点,例如节点B,D,H,J,M,O,P 我不一定从根A开始,假设我从一开始就在Node E,我想在某个节点完成,让我们说节点F.

如何从节点E开始找到最短的连续路径,允许我以任何顺序访问上面列出的所有选定节点,并在节点F完成路径?

最短,我的意思是在节点之间移动时成本最低。

起初我认为这意味着将Dijkstra的算法应用于每个节点到节点的组合,但是当我尝试编码时,我觉得我没有朝着正确的方向前进。

我正在寻找代码或解释算法以供参考。

提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

请注意,在树上只有一条从A到B的合理路径。从A上升到A和B的最低共同祖先,然后从那里下到B.更一般地说,如果你有一棵树您关心的节点集合以及不包含任何这些节点的子树,您知道您关心的节点中没有一条最佳路径会通过该子树。

我首先删除你不必访问的树中的所有叶子,然后删除你创建的所有新叶子,你不必访问,等等,直到你有一棵树其叶子只是您必须访问的节点。如果它的根只有一个子节点,则删除该根,依此类推,直到你有一个至少有两个子节点的根。

现在开始使用从E到根的路径,然后从那里开始到F.如果这访问了所有其他节点,那么就完成了。否则,至少有一个子树,其根位于该路径上,其中包含您必须访问的其他节点。在路径中编辑一个巡视路径,该路径离开路径以执行子树的深度优先巡视,然后返回到路径。继续,直到您已考虑所有未访问的节点。

相关问题