最短路径
1.1 最短路径的定义
其数学表现形式为:
在最短路径问题中,我们给定一个带权重的有向图G=(V, E) 和权重函数 ω:E→R , 该权重函数将每条边映射到实数值的权重上,图中一条路径 p=<v0,v1,...,vk> 的权重 ω(p) 是构成该路径的所有边的权重之和:
δ(p)={
min{
ω(p):u∼v},∞,如果存在一条从节点u到节点v的路径其他
从节点 u 到节点
最短路径可分为单源最短路径问题和多源最短路径问题。
1. 单源最短路径问题: 给定一个图 G=(V,E) , 我们希望找到从给源节点 s∈V 到每个节点 v∈V 的最短路径。
2. 多源最短路径问题 : 求任意两个节点的最短路径。
注意:这里讨论的算法都假设,不存在权重为负值的边并且不存在环路
1.2 单源最短路径
最短路径算法通常依赖最短路径的一个重要的性质:两个节点之间的一条最短路径包含着其他的最短路径。
1.2.1 无权图的最短路径问题
对于无权图来说,我们可以使用广度优先搜索算来进行求解。但是我们需要对BFS算法进行修改。因为,我们需要计算源点到任何节点的最短路径,所以我们需要一个数组dist用来保存最短路径的距离和使用path数组用来保存路径。
及dist[W] = S 到W的最短距离。则有dis[s] = 0 。
path[W] = S到W进过的某个节点。
伪代码为:
void shortestPath(Vertex s) {
dist[|V|] = -1;//首先对数组进行初始化
path[|V|]; //定义一个path数组
queue Q; //创建一个队列
Q.push(s); //将源点插入到队列中
while (!Q.empty()) { //如果队列不为空
v = Q.front(); Q.pop(); //出队列
for (v的每个邻接点 w) {
if (dist[w] == -1) { //如果等于-1表明,我们没有计算该节点