当前位置: 首页 > 知识库问答 >
问题:

有向循环图遍历寻找一定长度的路径

翁硕
2023-03-14

我有一个有向图,看起来有点像这样。所有边都是单向的,存在循环,有些节点没有子节点。

我想要一个遍历算法,目标是在图中的任意位置找到一条长度为n个节点的路径。该算法应该执行以下操作:

  • 起始节点是随机选择的,它遍历其子节点,并且访问的节点保留在某个位置以返回末尾的路径
  • 可以再次访问相同的节点
  • 如果它到达没有子级的节点,它将遍历具有未探索子级的最新节点。如果遍历了从起始节点开始的所有可能路径,请尝试从其他节点开始。(我认为这种方法可以确保探索所有可能的路径)
  • 当访问的节点数达到 n 并返回路径时,遍历停止
  • 如果未找到长度为 n 的路径,则返回“无有效路径”

我不确定是否已经存在这样的算法。大多数搜索算法似乎都在处理寻找最短路径、MST,并且不能访问相同的节点。对于我的需求,像A*和Dijkstra这样的寻路算法似乎过于复杂。我可能需要其中一个的修改版本,但不确定到底使用哪个。

共有2个答案

冯曾笑
2023-03-14

我会使用Node和Edge的每个节点跟踪所有连接边缘。Edges便宜地跟踪边缘长度的长度和它连接到的节点。

class Node(object):
    def __init__(self, identity):
        self.id = identity
        self.edges = set()

    def __str__(self):
        return f"node <id: {self.id}, edges: {self.edges}"
    __repr__=__str__


class Edge(object):
    def __init__(self, _from, to, length=1):
        _from.edges.add(self)
        self.to = to
        self.len = length

    def __str__(self):
        return f"edge <length: {self.len}, to: {self.to}"

    def __repr__(self):
        return f"edge <length: {self.len}>"

也不愿找一条这样长度的路

def getPathOfLength(nodes, length):
    for node in nodes:
        path = subGetPathOfLength(node, length)
        if not path is None:
            return path

def subGetPathOfLength(node, length):
    if length==0:
        return []
    
    for edge in node.edges:
        path = subGetPathOfLength(edge.to,
                                  length-edge.len)
        if not path is None:
            return [node] + path
    return None

在像这样创建连接图之后

nodes = []
for idx in range(8):
    nodes.append(Node(idx))

edges = []

edges.append(Edge(nodes[0], nodes[3]))
edges.append(Edge(nodes[3], nodes[4]))
edges.append(Edge(nodes[4], nodes[0]))

edges.append(Edge(nodes[7], nodes[0]))
edges.append(Edge(nodes[6], nodes[7]))
edges.append(Edge(nodes[2], nodes[6]))
edges.append(Edge(nodes[2], nodes[3]))


edges.append(Edge(nodes[1], nodes[3]))
edges.append(Edge(nodes[3], nodes[5]))
高迪
2023-03-14

听起来你只是想要一个简单的递归算法。这里有一些基本的伪代码。

find_path(node, n):   
   if n == 1:
       yield [node]
       return
   for each child of node n:
       for each path in find_path(child, n - 1):
           yield [node] + path
 类似资料:
  • 我需要为一组有向无环图找到从节点 0 开始的最长路径。我正在使用维基百科中的最长路径问题算法。我已经让算法适用于大多数图形,但对于其他图形,它没有给出正确的结果。算法为: 图形实现使用邻接列表来存储图形。如果我传递一个图,例如: 我得到的答案5,这是正确的。但是,如果我通过图表: 然后我得到2,而正确答案应该是3。 我使用的TopSort2算法是: DFS 算法包括:

  • 输入: 生成的树: 输出: 规则: < li >输入代码总是会产生一个有向无环图 < li >每个节点都有一些wait_time值 < li >完整的图形遍历应该计算整个图形的总等待时间 < li >必须并行遍历所有独立节点(或者至少时间计算应该是这样) < li >如果两个不同节点的wait_time发生重叠,则将考虑最大值,遍历时间较短的节点将移动到下一个独立节点 < li >除了根和叶(可以

  • 我有一个任务,我必须写一个方法,执行有向图的DFT。以下是有向边: 节点2-->节点4 节点3-->节点5 节点4-->节点5

  • 问题内容: 有没有办法遍历classpath中的所有类? 我想对实现特定接口的某些类进行一些反思性检查,但是我想完全动态地进行检查,而无需输入任何要检查的类,只需浏览类路径即可。 问题答案: 该思考图书馆可以帮助解决这个问题。正如其他人所述,在所有类加载情况下也不是完全可能的,但是如果您只有jar和文件,那么它将可靠地做到这一点。

  • 我正在MST上的CLRS中尝试ch23,这里有一个问题: 给定一个图G和一个最小生成树T,假设我们减少不在T中的一条边的权重。给出了在修改图中求最小生成树的算法。 我找到的一个解决方案是在中添加此新更改的边,然后在T中创建一个简单的循环,遍历此循环并删除此循环中的最大权重边,瞧,找到了新更新的MST! 我的问题是,如何在这个简单循环中只遍历节点?因为如果我在中从这个新添加的边的一个endpoint

  • 我是C语言的新手。我已经开始使用向量,并且注意到在我看到的所有通过索引迭代向量的代码中,循环的第一个参数总是基于向量的。Java我可能会使用ArrayList做这样的事情: 我在C语言中看不到这一点有什么原因吗?是不好的做法吗?