给定一个由两个各自节点和链接的列表表示的层次图,找到所有节点级别的最佳解决方案是什么?
以下节点的名称纯粹是虚构的,不会排序。 请注意,源节点应该很容易找到,因为它是唯一一个没有父节点的节点。
如果发生特殊情况(例如多个级别),则仅返回最大的一个。
插图:
输入:
g = Graph()
g.addNodes([0, 1, 2, 3, 4, 5, 6, 7])
g.addLink(0, 1)
g.addLink(0, 2)
g.addLink(1, 3)
g.addLink(1, 4)
g.addLink(1, 5)
g.addLink(2, 6)
g.addLink(6, 7)
getLevels(g.nodes, g.links)
输出:
#Node : Level
0 : 0
1 : 1
2 : 1
3 : 2
4 : 2
5 : 2
6 : 2
7 : 3
答案 0 :(得分:2)
从您谈论它的方式来看,听起来您想要的是树而不是图。否则,您实际上不是在编写“级别”算法,而是在编写“到节点的距离”算法。树木可以有层次,您需要的是图表上两个节点之间的最远距离。
如果您打算自己编写代码,则基本上可以执行breadth first search类型的算法,在该算法中,您的源节点(在本例中为0)找出与它链接的内容。如果要返回映射,则将等于这些节点的键设置为1,然后将值设置为1。然后查找到这些链接的下一个链接(不包括先前的节点),遍历这些链接,然后将值保存到映射中(当前值为2)。循环直到您不再有孩子。如果使用树来执行此操作,则可以删除检查以排除先前的节点。
答案 1 :(得分:0)
根据树的表示形式,您需要某种机制来枚举节点的子代。然后使用类似的功能
TellLevels(Root, Level):
Say "The node ", Root.Id, " has level ", Level
for Son= FirstSon(Root) to LastSon(Root)
TellLevels(Son, Level + 1)
并使用
调用它TellLevels(Root, 0)
仅在图形具有树形拓扑的情况下有效。
避免骑自行车:
TellLevels(Root, Level):
Root.Visited= true
Say "The node ", Root.Id, " has level ", Level
for Son= FirstSon(Root) to LastSon(Root)
if not Son.Visited
TellLevels(Son, Level + 1)