找到图表的最大长度

时间:2013-05-29 08:44:20

标签: java graph

我需要你的帮助才能解决问题。这是编码练习的一部分,我无法完全解决。

想象一下,我们有以下图表:

enter image description here

我需要构建一个计算路径最大长度的类。我没有根并且必须使用每个顶点作为起始点。该方法具有最大重复次数的参数,因此如果这1,我们可以只传递每个边一次,如果它是2我们可以通过每条边最多2次。

在这种情况下,如果重复= 1,则最大路径应为(B,A,C)。它重复= 2,那么最大路径应该是(B,A,B,A,C,C)。

为了解决没有重复的问题,我想到构建一个邻接列表并运行DFS来查找图中的所有路径并提取最大路径。我认为这应该适用于更简单的情况。

但是当我们可以重复边缘时,我不知道该怎么做。我可以用什么样的算法来解决这个问题。你还能想到一个更有效的解决这个问题的方法吗?

由于

3 个答案:

答案 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)

我可以看到一种天真的方法。它不是效率,但它有效。

两个要素:

  • 一个Hashmap,每个边的条目设置为0
  • 使用DFS获取图形(增加和减少hashmap以了解您的提取)

由于您没有root,我认为您必须为每个节点执行此提取。

您是否需要找到所有解决方案,或者您正在寻找一种接近的解决方案?

您无法在维基百科上找到有关此类问题的更多说明: http://en.wikipedia.org/wiki/Longest_path_problem