繁体   English   中英

Python基本生成树算法

[英]Python basic spanning tree algorithm

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

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

您没有说您需要使用哪种生成树算法。 DFS? BFS? 具有恒定重量的Prim's? 克鲁斯卡尔的体重恒定吗? 另外,由于图形未加权,因此“最接近”的未连接顶点是什么意思? 与给定顶点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)已经在树中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM