最长路径,具有递增边缘权重,在循环无向图中

时间:2014-05-14 03:54:07

标签: algorithm graph

我想找到循环无向图中最长的路径。每对边都与成本相关联。

遍历的约束是权重应按升序排列。因此,我希望找到具有递增权重的最长路径。

我们可以使用DFS来解决问题吗?我正在尝试实施它,但我不知道如何处理周期。

3 个答案:

答案 0 :(得分:3)

如果遍历的唯一约束是体重不断增加,那么您不必担心周期。最终,由于您在最高加权边上输入了一个顶点,因此每个循环都将终止,因此没有边缘可以退出顶点。

答案 1 :(得分:1)

这是我的方法..

<强>科

stack = create empty stack
branched = create empty list
tree = create empty tree

stack.push({node=start_node, distanct=0, tree.root})
tree.root = start_node
branched.add(start_node)

while stack is not empty:
{
    current_node = stack.pop()

    if current_node is end_node:
        skip

    for each neighbour_node of current_node:
    {

        if neighbour_node is parent of current_node.getTreeNode():
            skip

        if neighbour_node exist in branched list:
            current_node.getTreeNode().addChild(neighbour_node, TYPE_LINK)
        else:
            current_node.getTreeNode().addChild(neighbour_node, TYPE_BRANCH)
            stack.push(neighbour_node)
    }
}

这种分支是最佳的,因为每当访问节点被分支时,我们将它作为LINK插入树中,稍后我们将使用它来最大化或最小化以便找到包含的唯一路径start_nodeend_node之间没有周期。

<强>优化

tree2 = create empty tree
tree2.root = empty_node

for each leaf in tree.getLeaves():
    if leaf is end_node:
        tree2.root.addPath(tree.getPath(leaf).reverse())

for each leaf in tree.getLeaves():
    if leaf is TYPE_LINK:
        L = tree2.findAll(leaf)    
        for each node in L:
            if L.getChildren() doesn't contain this node:
                L.addPath(tree.getPath(node).reverse())

solution = { none, 0 }

for each leaf in tree2.getLeaves():
    if leaf is start_node AND leaf.depth > solution.depth:
        solution = leaf

return solution

首先我们选择end_node并形成tree2,首先找到start_node的直接路径,然后将喜欢的路径添加为分支。最后,我们采取最深的leaf

答案 2 :(得分:0)

您可以创建有向图G&#39;其中顶点表示原始边的边。在图G&#39;有从顶点A&#39;到顶点B&#39;如果对应边缘A-> B创建上升路径。现在问题可以说是在图G中找到最长的路径。图G&#39;是一个DAG,我们可以在拓扑上对其进行排序,并在简单的遍历中找到最长的路径。