上一篇采用的是优先队列实现,这篇用广度搜索实现,从图示+代码层更好理解了
图示
算法思路
定义三个数组
- $visited: 记录各个顶点是否访问过1表示访问过,0未访问;
- $preVisited: 每个下标对应的值为前一个顶点下标[可以访问到任何顶点的最短路径];
- $distance: 记录出发顶点到其他所有顶点的距离;
比如G为出发顶点,就会记录G到其它顶点的距离,会动态更新,求的最短距离就会存放到distance
算法过程
- 设置出发顶点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis 集合记录着 v 到图中各顶点的距离(到自身可以看作 0,v到 vi 距离对应为 di)
- 从Dis中选择值最小的di并移出Dis集合,同时移出V集合中对应的顶点vi,此时的v到vi为最短路径
- 更新Dis集合,更新规则为:比较v到V集合中顶点的距离值,与v通过vi到V集合中顶点的距离值,保留值较小的一个(同时也应该更新顶点的前驱节点为 vi,表明是通过 vi 到达的)
- 重复执行两步骤,直到最短路径顶点为目标顶点即可结束
PHP代码实现
1 | class Graph |
运行结果
1 | 已访问过的顶点: |