在具有一堆普通节点和一些特殊标记节点的图形中,是否有一种通用算法可以从图形中的给定起始位置找到最接近的标记节点?
或者是进行BFS搜索以查找已标记节点然后在每个发现的标记节点上执行Dijkstra以查看哪一个最接近的最佳方式?
答案 0 :(得分:3)
这取决于图表和“最近”的定义。
如果计算“最接近”忽略边权重,或者图形没有边权重,则简单的广度优先搜索(BFS)就足够了。根据BFS的定义,达到v B的第一个节点是最接近的(或者,如果有几个最接近的节点,则为接近度而绑定)。如果您跟踪扩展BFS级别的数量,则可以通过到达级别的末尾来找到所有最近的节点,而不是在找到第一个标记的节点后立即停止。
如果您有边缘权重,并且需要在计算中使用它们,请改用Dijkstra。如果边缘可以具有负权重,并且恰好有任何负周期,那么您将需要使用Bellman-Ford。
如SaiBot所述,如果起始节点始终相同,并且您将通过更改“标记”节点执行多个查询,则可以采用更快的方式执行操作。特别是,您可以在每个节点中存储在第一次完整遍历中找到的“父级”,以及节点到起始节点的距离。添加新批 k 标记的节点时,您可以通过查看每个标记节点的距离来立即知道最接近起点。
答案 1 :(得分:1)
最快的方法是从你的起始位置(起始节点)开始执行Dijkstra。当“接近度”定义为必须遍历的边数时,您只需为每条边指定权重1即可。如果允许预计算,将会有更快的方法。