示例:
如图所示,寻找V3到V5的最短路径。
基本思想
从起点V3出发,依次访问V3的邻结点,将它们存入队列,以便接着访问。同时,在右侧访问列表中记录visit(是否已经访问)、dist(从V3到该点的距离)、path(上一邻结点)。最终结果如右表所示,该表中dist为V3到其余点的距离。因此,V3到V5的最短路径为3。
js实现方法
// 无权图的最短路径
function uwG(start, end) {
v_num = 7;
G = new Array(v_num).fill(0).map(() => new Array(v_num).fill(0));
G[0][1] = 1;G[0][3] = 1;G[1][3] = 1;G[1][4] = 1;G[2][0] = 1;G[2][5] = 1;G[3][4] = 1;G[3][5] = 1;G[3][6] = 1;G[4][6] = 1;G[6][5] = 1;
visit = new Array(v_num).fill(-1);
dist = new Array(v_num).fill(-1);
path = new Array(v_num).fill(-1);
Queue = new Array();
Queue.push(start); /* 起始节点存入队列尾部 */
visit[start] = 1; /* 起始节点已经访问 */
dist[start] = 0; /* 起始节点到起始节点的距离为 0 */
while (Queue.length > 0) {
node = Queue[0]; /* 取出头结点 */
Queue.shift(); /* 删除头结点 */
for (i = 0; i < v_num; i++) {
if (visit[i] == -1 && G[node][i] == 1) { /* 如结点i未被访问过,且为node的邻结点 */
visit[i] = 1; /* 设置 结点i 已被访问*/
dist[i] = dist[node] + 1; /* 结点i 到起始节点的距离为 node结点到起始节点距离+1*/
path[i] = node; /* 结点i的上一结点为 node */
Queue.push(i); /* 结点i存入队列 */
}
}
}
return dist[end]; /* 返回最终结点到起始结点的距离 */
}
console.log(uwG(2, 4));