Python基本生成树算法

时间:2016-09-10 18:39:00

标签: python spanning-tree

我无法弄清楚如何在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)

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

1 个答案:

答案 0 :(得分:0)

您不会说您需要使用哪种生成树算法。 DFS? BFS? Prim的重量恒定? Kruskal的重量恒定?另外,你最近"是什么意思?未连接的顶点,因为图是未加权的?与给定顶点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)已经在树中。

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

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