【问题标题】:Python basic spanning tree algorithmPython基本生成树算法
【发布时间】:2016-09-10 18:39:00
【问题描述】:

我不知道如何在 Python 中实现一个基本的生成树;未加权的生成树。

我已经学会了如何实现邻接列表:

for edge in adj1:
    x, y = edge[int(0)], edge[int(1)]
    if x not in adj2: adj2[x] = set()
    if y not in adj2: adj2[y] = set()
    adj2[x].add(y)
    adj2[y].add(x)
print(adj2)

但我不知道如何实现“寻找最近的未连接顶点”。

【问题讨论】:

  • 注意:输入将是一个邻接列表。
  • 您能否提供更多信息 - 输入数据的示例、预期的输出数据以及您尝试过的内容。您的问题太模糊,人们无法为您提供帮助。
  • 对不起。输入将是:
  • {0: {1, 2}, 1: {0, 2, 3}, 2: {0, 1}, 3: {1}} 或 [[1,2],[ 0,2,3],[0,1],[1]]
  • 对不起,这是一个非常模糊的问题(漫长的夜晚/累了)。基本上,我正在尝试创建一种算法,将邻接列表的列表(或字典)表示形式的列表转换为生成树的列表表示形式。因此,从邻接列表创建生成树。

标签: python spanning-tree


【解决方案1】:

你没有说你需要使用哪种生成树算法。 DFS? BFS? Prim的重量恒定?克鲁斯卡尔的恒重?另外,“最近的”未连接顶点是什么意思,因为该图是未加权的?与给定顶点 v 相邻的所有顶点与 v 的距离相同。最后,您是否应该从任意顶点开始?在 0?在用户指定的顶点?我将假设为 0 并尝试将您推向正确的方向。

您需要有一些方法来表示哪些顶点已经在生成树中,这样您就不会沿着另一条边将它们重新添加到树中。这将形成一个循环,这不可能在树中发生。由于您肯定需要一种表示树的方法,例如您给出的 [ [1], [0,2,3], [1], [1] ] 示例,因此开始的一种方法是使用 [ [], [],[],[]]。

您还需要确保最终将所有内容都连接到一棵树上,而不是用两棵树完成,这两个树合在一起覆盖了所有顶点,但它们之间没有通过任何节点相互连接边缘。有两种方法可以做到这一点:(1)从单个顶点开始,逐步增长树,直到它覆盖所有节点,这样你就不会拥有超过一棵树。 (2) 以其他方式添加边,跟踪连接的组件,以便您可以确保最终连接所有组件。除非你知道你需要 (2),否则我建议坚持使用 (1)。

解决您的具体问题:如果您有输入 inputgraph = [[1,2],[0,2,3],[0,1],[1]],并且您从 currtree = [ [], [], [], [] ],从顶点 0 开始,然后查看 inputgraph[0],发现 0 与 1 和 2 相邻,然后选择 (0,1) 或 (0 ,2) 成为树中的一条边。假设您使用的算法告诉您选择 (0,1)。然后将 currtree 更新为 [ [1], [0], [], [] ]。然后,您的算法会指示您在 0 处选择另一条边,在此输入图中必须为 (0,2),或者指示您在 1 处选择一条边,可能是 (1,2) 或 (1,3) )。请注意,您的算法必须跟踪 (1,0) 在 1 处不是可接受的选择这一事实,因为 (0,1) 已经在树中。

您需要使用我上面列出的算法之一,或其他一些生成树算法,系统地确定下一个要检查的顶点,以及接下来要选择的边。

我希望这能让您了解必须考虑的问题以及如何将抽象算法描述映射到运行代码。我把学习算法留给你!

【讨论】:

  • 您好,感谢您的详细回复。我对这一切都很陌生,所以我仍在弄清楚。我以前听说过 DFS 和 BFS,但不知道我需要为此使用它们。我试图弄清楚如何编写一个算法,该算法采用从邻接列表生成的列表,例如:0 1 2 1 0 2 1 3,并将其转换为生成树的顶点列表表示。不过,我会听从你的建议。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多