什么是单源最短路?
给定图中,给定的某个点到其余各点的最短路径为单源最短路径。Dijkstra算法思路:
1)设置一个集合S,放已找到最短路径的点。
2)将源点并与S,初始化源点s到V-S中其余各点的“当前最短距离”。
3)重复一下操作n-1次:从V-S中找当前最短路径对应的点,并入S,更新源点到其余点的最短距离。Dijkstra代码实现:
//final数组记录当前点是否已并入源点的集合S中
//D数组是源点到当前点的“最短路径”
int final[n],D[n];
final[v0] = true;//给定源点并入集合S中(判断某点是否在集合中,即看对应的final数组是什么)
for(int i = 0;i < G.vexnum; ++i)
{
//初始化final数组
if(i != v0)
final[i] = false;
//初始化源点到其余各点的距离
D[i] = G.arcs[v0][i];
//如果需要记录路径
if(D[i] < INFINITY)
Path[i] = "v0->i";
}
//控制重复n-1次
for(int i = 0;i <G.vexnum; ++i)
{
int v;
//从V-S中选取当前路径最短的点
minn = INFINITY;
for(int w = 0;w < G.vexnum; ++w)
{
if(!final[w] && minn > D[w])
{
minn = D[w];
v = w;
}
}
//v就是当前最短路径对应的点,minn就是最短路径的大小
final[v] = true;//并入集合S中
for(int w = 0; w < G.vexnum; ++w)
{
if(!final[w] && D[w] > minn + G.arcs[v][w])
{
D[w] = minn + G.arcs[v][w];
Path[w] = strcat(Path[v],"->w");//更新当前源点到w的最短路(v是刚加入源点集合的点)
}
}
}
- 特定源点到特定终点的最短路的时间复杂度同Dijkstra相同,没有更好的算法。
- Dijkstra算法是贪心算法的一种,每次都找最优的,最后的结果也是最优的。