我想找到循环无向图中最长的路径。每对边都与成本相关联。
遍历的约束是权重应按升序排列。因此,我希望找到具有递增权重的最长路径。
我们可以使用DFS来解决问题吗?我正在尝试实施它,但我不知道如何处理周期。
答案 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_node
和end_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,我们可以在拓扑上对其进行排序,并在简单的遍历中找到最长的路径。