0

我不知道如何在 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)

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

4

1 回答 1

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) 已经在树中。

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

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

于 2016-09-10T21:41:58.233 回答