理论上,我可以使用Dijkstra算法来查找所有节点的距离,但如果我有一个大图,我将浪费大量时间来计算到远程节点的距离。有没有更有效的算法?
答案 0 :(得分:2)
如果边缘没有加权(或等效,如果它们都具有相同的权重),您可以只运行广度优先搜索直到所需的深度。如果他们 加权,Dijkstra的算法是你的最佳选择:它还按照距离起始顶点的距离增加的顺序探索节点,所以只要找到下一个顶点远离它,就停止它。你的最大允许距离。
答案 1 :(得分:1)
您可以使用修改后的广度优先搜索(即使是加权图表)。
listNodes(node start , int maxRange)
list queue
set visited
add(queue , start)
add(visited , start)
while ! isEmpty(queue)
pair p = remove(queue , 0)
int distTmp = p.dist
node n = p.node
//only neighbours that haven't yet been visited
for node next in disjoint(listNeighbours(n) , visited)
add(visited , next)//mark as visited
//store the node in the queue with the distance to start as attribute
add(queue , pair(next , distTmp + distance(n , next)))
return visited
如果图表未加权,则distance(node , node)
将始终为neighbournodes返回1.