Java 求图的最大长度

Java 求图的最大长度,java,graph,Java,Graph,我需要你的帮助来解决一个问题。这是编码练习的一部分,我无法完全解决 假设我们有下图: 我需要构建一个类来计算路径的最大长度。我没有根,必须使用每个顶点作为起点。该方法有一个最大重复次数的参数,所以如果这是1,我们可以只通过每条边一次,如果是2,我们可以通过每条边最多2次 在这种情况下,如果repeats=1,则最大路径应为(B,A,C)。它重复=2,那么最大路径应该是(B,A,B,A,C,C) 为了在不重复的情况下解决这个问题,我考虑构建一个邻接列表并运行DFS来查找图中的所有路径并提取最大路

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

假设我们有下图:

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

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

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

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


谢谢

您可以使用深度优先搜索的修改版本

在这种情况下,您不仅将节点标记为已访问,而且还向其添加了一些卫星数据:已访问次数,当它到达
重复
时,您将其标记为已访问

维基百科中修改的伪代码:

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
程序DFS(G,v):
增量v.访问时间
对于所有边,例如,相邻边(v)do
如果边e.times<重复,则
W← G.邻接顶点(v,e)
如果顶点w.timesVisited<重复,则
e、 访问时间++
递归调用DFS(G,w)
其他的
标签e作为后缘
我希望它能工作,因为我没有测试修改。

如果我理解正确, 这两种情况的解决方案类似

对于无重复的解决方案:将每个节点作为根, 并对其子系统启动DFS。 节点的有效子节点是尚未访问的节点

对于N重复问题: 有效子节点是指访问次数少于N次的节点。 在DFS中的每次访问中,您都需要更新该节点的访问计数器。
另外,当您完成对特定节点的子节点的探索后,您需要将其访问计数器归零。

我可以看到一种幼稚的方法。这不是效率而是有效的

两个要素:

  • 将每个边的条目设置为0的哈希映射
  • 使用DFS获取图形(递增和递减hashmap以了解您的获取)
由于您没有根,我认为您必须为每个节点执行此抓取

您是否需要找到所有的解决方案,还是正在寻找一个接近的解决方案

你在维基百科上找不到关于这类问题的更多解释:

我认为,一旦节点完成在其子树中的移动,您需要重置节点中的访问次数。我确实实现了此版本,它可以按预期工作。谢谢大家的帮助如果每个边缘都可以访问一次(并且每个节点可以访问任意数量),您应该获得BABCC吗?BAC甚至不是您绘制的图形的有效路径。