Algorithm 在图形中查找最近的标记节点

Algorithm 在图形中查找最近的标记节点,algorithm,graph,graph-algorithm,shortest-path,Algorithm,Graph,Graph Algorithm,Shortest Path,在一个有一群普通节点和几个特殊标记节点的图中,是否有一个通用的算法从图中给定的起始位置找到最近的标记节点 或者最好的方法是进行BFS搜索以找到标记的节点,然后对每个已发现的标记节点进行Dijkstra,以查看哪一个是最近的节点?最快的方法是立即从起始位置(起始节点)执行Dijkstra。当“紧密度”定义为必须遍历的边数时,您可以为每条边指定1的权重。如果允许进行预计算,将有更快的方法进行预计算 这取决于图表和您对“最近”的定义 如果忽略边权重计算“最近的”,或者图形没有边权重,那么简单的宽度优先

在一个有一群普通节点和几个特殊标记节点的图中,是否有一个通用的算法从图中给定的起始位置找到最近的标记节点


或者最好的方法是进行BFS搜索以找到标记的节点,然后对每个已发现的标记节点进行Dijkstra,以查看哪一个是最近的节点?

最快的方法是立即从起始位置(起始节点)执行Dijkstra。当“紧密度”定义为必须遍历的边数时,您可以为每条边指定1的权重。如果允许进行预计算,将有更快的方法进行预计算

这取决于图表和您对“最近”的定义

如果忽略边权重计算“最近的”,或者图形没有边权重,那么简单的宽度优先搜索(BFS)就足够了。根据BFS的定义,到达vía BFS的第一个节点是最近的(或者,如果有多个最近的节点,则为接近而绑定)。如果跟踪扩展BFS级别的数量,则可以通过到达级别末尾来定位所有最近的节点,而不是在找到第一个标记的节点后立即停止

如果您有边权重,并且需要在计算中使用它们,请使用Dijkstra。如果边具有负权重,并且恰好存在任何负循环,那么您将需要使用Bellman Ford


如所述,如果开始节点始终相同,并且您将通过更改“标记”节点来执行多个查询,则有更快的方法来执行操作。特别是,您可以在每个节点中存储在第一次完全遍历中找到的“父节点”,以及节点到起始节点的距离。当添加一批新的k标记节点时,您可以通过查看每个标记节点的此距离立即知道最接近开始的节点。

能否为问题添加更多详细信息?图是有向的吗?也许您有一个恒定(或很少变化)的图和许多查询?或者你每次都会遇到新的问题?你对标记顶点的数量有任何限制吗?你能定义“最近点”吗。空间上最近、最少的网络跳数、最短的网络距离还是其他什么?@SaiBot By closer我指的是与起始节点交叉的边数最少的节点。如果添加一个constant@tucuxi是的,图表将不加权。在这种情况下,BFS将如何使用?只要找到一个标记的节点,它就会停止,因为那是最近的一个,对吗?如果你有一个启发式,你也可以通过将启发式设置为所有端节点的最小值来使用*。@谢谢,我已经很久没有读过这个理论了,现在正在更正我的答案。是贝尔曼·福特@约翰斯莱恩澄清了BFS的答案。是的,找到的第一个最近(或并列)。如果跟踪标高(=从起点跳下)并完成标高,则可以找到所有最近的标记节点。