我需要你的帮助才能解决问题。这是编码练习的一部分,我无法完全解决。
想象一下,我们有以下图表:
我需要构建一个计算路径最大长度的类。我没有根并且必须使用每个顶点作为起始点。该方法具有最大重复次数的参数,因此如果这1,我们可以只传递每个边一次,如果它是2我们可以通过每条边最多2次。
在这种情况下,如果重复= 1,则最大路径应为(B,A,C)。它重复= 2,那么最大路径应该是(B,A,B,A,C,C)。
为了解决没有重复的问题,我想到构建一个邻接列表并运行DFS来查找图中的所有路径并提取最大路径。我认为这应该适用于更简单的情况。
但是当我们可以重复边缘时,我不知道该怎么做。我可以用什么样的算法来解决这个问题。你还能想到一个更有效的解决这个问题的方法吗?
由于
答案 0 :(得分:1)
您可以使用深度优先搜索的修改版本。
在这种情况下,您不仅要将节点标记为已访问,还要为其添加一些卫星数据:访问次数以及何时达到repeats
你标记他们访问。
来自维基百科的修改后的伪代码:
procedure DFS(G,v):
increment v.timesVisited
for all edges e in G.adjacentEdges(v) do
if edge e.timesVisited < repeats then
w ← G.adjacentVertex(v,e)
if vertex w.timesVisited < repeats then
e.timesVisited++
recursively call DFS(G,w)
else
label e as a back edge
我希望它有效我没有测试修改。
答案 1 :(得分:0)
如果我理解正确, 对于这两种情况,解决方案都类似。
对于没有重复的解决方案:以每个节点为根, 并为其子女开始DFS。 节点的有效子节点是尚未访问过的节点。
对于N重复问题: 有效子节点的访问次数少于N次。 在DFS中的每次访问中,您需要更新该节点的访问计数器。 此外,当您完成对特定节点的子节点的探索时,您需要将其访问计数器归零。
答案 2 :(得分:0)
我可以看到一种天真的方法。它不是效率,但它有效。
两个要素:
由于您没有root,我认为您必须为每个节点执行此提取。
您是否需要找到所有解决方案,或者您正在寻找一种接近的解决方案?
您无法在维基百科上找到有关此类问题的更多说明: http://en.wikipedia.org/wiki/Longest_path_problem