Algorithm 通过选择根节点减少广度优先树的深度

Algorithm 通过选择根节点减少广度优先树的深度,algorithm,breadth-first-search,Algorithm,Breadth First Search,如果根节点可以在图中随机选取,是否有现有的算法选取根节点,以使生成的宽度优先树具有最小的深度或高度 我有一种预感,我应该选择扇出最大的节点作为根节点 让我举一个例子 有一个循环有向图{(0,1)、(1,2)、(1,5)、(1,6)、(2,3)、(3,4)、(4,2)、(5,2)、(6,0)} 如果选择节点0作为根,则宽度优先树为{(0,1)、(1,2)、(1,5)、(1,6)、(2,3)、(3,4)} 深度为5 如果选择节点6作为根,则宽度优先树为{(6,0)、(0,1)、(1,2)、(1,

如果根节点可以在图中随机选取,是否有现有的算法选取根节点,以使生成的宽度优先树具有最小的深度或高度


我有一种预感,我应该选择扇出最大的节点作为根节点


让我举一个例子

有一个循环有向图{(0,1)、(1,2)、(1,5)、(1,6)、(2,3)、(3,4)、(4,2)、(5,2)、(6,0)}

如果选择节点0作为根,则宽度优先树为{(0,1)、(1,2)、(1,5)、(1,6)、(2,3)、(3,4)} 深度为5

如果选择节点6作为根,则宽度优先树为{(6,0)、(0,1)、(1,2)、(1,5)、(2,3)、(3,4)}
深度为6

我假设您谈论的是一个加权图,否则从不同的节点作为根进行BFS并没有多大区别

一种简单的蛮力方法是以图的每个节点为根,构造BFS树。每次测量高度,将所有节点作为根覆盖后,我们得到BFS树产生最小高度的节点。如果你这么做了,你可能会花很多时间。时间:

O(n*(v+e)+logxn)
对于每个节点n,我们进行BFS+对于每个树,我们计算树中的高度
x
级别。但我怀疑动态规划这次可以把我们带到一个更易于管理的水平。因为我们在每个阶段都存储结果,所以我们可以在以后的计算中重用它

想到的另一种方法是处理图形&将每个节点的权重整理成一个数组。使用此权重,我们将构造一个BST,这样具有最大权重的节点将落在BST的根附近,而具有较小权重的节点将落在BST中的较低位置(一些可能是叶子)。这样,在BST中搜索时,找到节点的可能性更大

更新:要扩展上述方法-

上面的递归很简单,我们逐个尝试将每个节点作为root
r
<代码>r从
i到j
不等。我们递归地计算从i到r-1和r+1到j的最优成本,r为根。我们将权重(或频率)之和从i添加到j(见上述公式中的第一项),这是因为每次搜索都会经过根,每次搜索都会进行一次比较


希望这有助于…

执行BFS时可以重复节点吗?我们是否可以假设图是非循环的,或者至少有一个节点没有输出边(在这种情况下,问题很简单)?节点不能重复,因为有白色-灰色-黑色标记。图是循环的。BFS是否需要跨越整个图?例如,在这样一个图中:
1->2->3->4
,选择
4
作为根将使深度为1,因为它无法展开。在这种情况下,期望的行为是什么?你能用任何一片叶子来回答这个问题吗?好问题。实际上我有算法的第二部分。如果未使用BFS遍历所有节点,则会找到另一个根节点并再次运行BFS。对于你的例子,顺序是,BFS(G,4),BFS(G,3),BFS(G,2)和BFS(G,1)。或者,如果选择1作为根节点,一个BFS(G,1)就足够了。但是,对于这种情况,生成的树应该是相同的