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

算法是图中节点A连接到节点B

陆昕
2023-03-14

我正在寻找一个算法来检查任何有效的连接(最短或最长)之间的两个任意节点在一个图上。

我的图被固定为一个具有逻辑(x,y)坐标的网格,具有北/南/东/西连接,但是节点可以随机移除,所以你不能假设取离目标最近的coords的边总是会让你到达那里。

代码是用Python编写的。数据结构是每个节点(对象)都有一个连接节点的列表。列表元素是对象引用,因此我们可以递归地搜索该节点的连接节点列表,如下所示:

for pnode in self.connected_nodes:
    for cnode in pnode.connected_nodes:
        ...etc

尽管许多张贴的答案可能很有效,但DFS是快速、简单和非常合适的。我不喜欢在具有高值权重的节点之间粘贴额外的边来使用Dijkstra的想法,因为节点本身可能会像边一样消失。SSC方法似乎更适合于区分强连通和弱连通的图截面,在我的图中,如果G和H之间存在一条边,这种方法就可以工作。

下面是我的DFS搜索实验代码,它创建了与图中所示相同的图。

class node(object):
    def __init__(self, id):
        self.connected_nodes  = []
        self.id               = id

    def dfs_is_connected(self, node):
        # Initialise our stack and our discovered list
        stack      = []
        discovered = []

        # Declare operations count to track how many iterations it took
        op_count = 0

        # Push this node to the stack, for our starting point
        stack.append(self)

        # Keeping iterating while the stack isn't empty
        while stack:
            # Pop top element off the stack
            current_node = stack.pop()

            # Is this the droid/node you are looking for?
            if current_node.id == node.id:
                # Stop!
                return True, op_count

            # Check if current node has not been discovered
            if current_node not in discovered:

                # Increment op count
                op_count += 1

                # Is this the droid/node you are looking for?
                if current_node.id == node.id:
                    # Stop!
                    return True, op_count

                # Put this node in the discovered list
                discovered.append(current_node)

                # Iterate through all connected nodes of the current node
                for connected_node in current_node.connected_nodes:
                    # Push this connected node into the stack
                    stack.append(connected_node)

        # Couldn't find the node, return false. Sorry bud
        return False, op_count


if __name__ == "__main__":

    # Initialise all nodes
    a = node('a')
    b = node('b')
    c = node('c')
    d = node('d')
    e = node('e')
    f = node('f')
    g = node('g')
    h = node('h')
    j = node('j')
    k = node('k')
    l = node('l')
    m = node('m')
    n = node('n')
    p = node('p')
    q = node('q')
    r = node('r')
    s = node('s')

    # Connect up nodes
    a.connected_nodes.extend([b, e])
    b.connected_nodes.extend([a, f, c])
    c.connected_nodes.extend([b, g])
    d.connected_nodes.extend([r])
    e.connected_nodes.extend([a, f, j])
    f.connected_nodes.extend([e, b, g])
    g.connected_nodes.extend([c, f, k])
    h.connected_nodes.extend([r])
    j.connected_nodes.extend([e, l])
    k.connected_nodes.extend([g, n])
    l.connected_nodes.extend([j, m, s])
    m.connected_nodes.extend([l, p, n])
    n.connected_nodes.extend([k, m, q])
    p.connected_nodes.extend([s, m, q])
    q.connected_nodes.extend([p, n])
    r.connected_nodes.extend([h, d])
    s.connected_nodes.extend([l, p])

    # Check if a is connected to q
    print a.dfs_is_connected(q)
    print a.dfs_is_connected(d)
    print p.dfs_is_connected(h)

共有1个答案

裘嘉木
2023-03-14

要找到这一点,您只需要在其中一个节点上运行简单的DFS或BFS算法,它将在图的一个连续组件中找到所有可到达的节点,所以如果在算法运行期间找到了另一个节点,您只需将其标记下来。

 类似资料:
  • 我有一个以网状方式相互连接的节点的无向网络(即每个节点的度>=2)。我正在尝试找到一种方法来找到连接到网络中其他节点的最小数量的节点。 但通常情况不是这样,因为我需要手动找到其他节点。我想我可以使用最高度节点(例如x)作为源,使用找到到其他节点的最短路径。然后我可以迭代最短路径来找到其他节点。但是这种方法很乏味,我想知道是否有人有任何其他建议,使用networkx中可用的工具来最佳地解决这个问题。

  • null V: BrowserTimeout:0 调试:false DownPollingLimit:2 集线器:http://jenkins主机:jenkins端口 ID:http://node ip:node端口 null 异常的第一行说它无法解析某些东西,但我不能理解什么? 我是不是漏掉了什么?我是第一次做网格设置。

  • 我试图在Spring MVC应用程序中配置ElasticSearch存储库。我使用Spring Data ElasticSearch版本:2.0.7和ElasticSearch Server 2.4.4。 我确信ElasticNode可以工作,下面是示例输出 这是我的测试配置 我得到的错误,应用程序无法连接到弹性节点,堆栈跟踪 我试图从1.7.1, 2.4.4和5.2.1更改弹性搜索节点的版本。没

  • EasyReact 的重点就是让节点之间的数据流动起来,所以连接节点是很重要的。 如何连接两个节点 两个节点是通过变换来连接的,在源码目录 EasyReact/Classes/Core/NodeTransforms 中我们默认实现了了很多的变换,你也可以通过继承 EZRTransform 类来实现自己的变换,一旦我们创建好一个变换后,就可以通过如下方式进行连接了: EZRMutableNode<N

  • 我遇到了一个问题,我知道如何计算树中的所有节点,像这样

  • 假设我有一个无向多图,即一个(G,E)对,其中G是一个有限的结点集,E是一个有限的边集。我正在寻找一个算法,将分配一个单一的字符串值到每个节点在以下的约束。 1. 每个节点都被赋予一组约束(可能是空的),这些约束限制了允许的值。我希望至少支持以下类型的值约束: null 有两种类型的边缘: 不同, 相同, 这意味着应该为相关节点分配不同/相同的值(意味着不相等/相等的字符串)。 null 这意味着