按长度路径返回python文件中的节点数

按长度路径返回python文件中的节点数,python,graph,edges,Python,Graph,Edges,在项目的最后一个问题中,我遇到了一个python难题 假设您得到了一个类似的文件: 1 2 2 3 3 4 如果节点1通过边链接到节点2,则可以通过长度为1:1-2的路径访问节点2 如果1将2自身链接到3,并将自身链接到4,则4可通过长度为4的路径从1:1-2-3-4访问 我想返回默认情况下长度为3的路径可从给定节点访问的节点数 谢谢你的建议和帮助 编辑: def bfs(graph, start_node, distance): if distance == 0:

在项目的最后一个问题中,我遇到了一个python难题

假设您得到了一个类似的文件:

1 2
2 3
3 4
  • 如果节点1通过边链接到节点2,则可以通过长度为1:1-2的路径访问节点2

  • 如果1将2自身链接到3,并将自身链接到4,则4可通过长度为4的路径从1:1-2-3-4访问

  • 我想返回默认情况下长度为3的路径可从给定节点访问的节点数

谢谢你的建议和帮助

编辑:

def bfs(graph, start_node, distance):
    if distance == 0:
        return [start_node]
    visited = []
    queue = []
    nodes_at_dist = []

    level = 0
    visited.append(start_node)
    queue.append((start_node, level))

首先,我们重建数据结构以简化查找,即哪些节点是可访问的。我假设我们的图是无向的

graph = [(1, 2), (2, 3), (3, 4), (1, 4), (2, 6), (6, 7)]

# we restructure our input to simplify the lookup
graph_dict = {}
for n1, n2 in graph:
    if n1 not in graph_dict:
        graph_dict[n1] = set()
    if n2 not in graph_dict:
          graph_dict[n2] = set()
    graph_dict[n1].add(n2)
    graph_dict[n2].add(n1)
因此,我们有一个
dict
,其中键是所有现有节点,相应的值是一组直接连接的所有节点:

{1: {2, 4}, 2: {1, 3, 6}, 3: {2, 4}, 4: {1, 3}, 6: {2, 7}, 7: {6}}
下一部分本质上是我们的方法,该方法根据固定距离查找可达节点:

def bfs(graph_dict, start_node, distance):
    # We reached the end and return the current node
    if distance == 0:
        return {start_node}
        
    # We look-up all nodes which are reachable with one step
    reachable = graph_dict[start_node]
        
    # Now we iterate through this set and call our method again (recursively)
    result=set()
    for node in reachable:
        tmp=bfs(graph_dict, node, distance-1)
        result=result.union(tmp)
    return result 
示例输出1:distance=2,start\u node=1

{1, 3, 6}
{2, 4, 7}
请注意,“1”在我们的结果集中,因为我们可以走1-2-1(这是两个步骤)

示例输出2:距离=3,开始节点=1

{1, 3, 6}
{2, 4, 7}

请注意,“2”在我们的结果集中,因为我们可以走1-2-1-2(这是三个步骤)。

创建一组可以直接从给定节点访问的节点。此集合是路径长度1可访问的节点。遍历集合以创建可直接从第一个集合的节点访问的新的节点集合。然后,该集合具有路径长度为2的所有可访问节点。重复使用新创建的集合,以查找长度为3的节点,依此类推。是的,我给出了一个简单的示例,但实际上,我有5000个节点。。。但我不知道如何在pythonTry中实现这一点,即按照所描述的步骤,在此处使用代码询问您是否有特定问题。我编辑我的答案是为了向您表明您是否删除了您的答案?我只是编辑了它。请再试一次。第
result=result.union(a)
行中出现错误。有一个
b
而不是
结果
。请让我知道当你得到一个错误,这是无关的。是的,我纠正了这个错误,但它是关于我得到的错误,我纠正了我的代码上面-抱歉!请将
result=result.union(a)
替换为
result=result.union(tmp)
并将
result=bfs(图dict,节点,距离-1)
替换为
tmp=bfs(图dict,节点,距离-1)
好的,谢谢!!现在我可以问你一些问题来反驳吗?当然,然后我会相应地更新我的答案。如果答案是正确的,请接受它。请查看此处了解更多详细信息: