- 带权路径长度:任意一对顶点间所需要经过的边的权值和。
- 最短路径:带权路径长度最短的一条边。
最短路径问题一般可以分为两类,每一类都有经典的算法求解:
- 单源最短路径:BFS(无权)、Dijkstra(有权+无权)。
- 每对顶点间的最短路径:Floyd(有权+无权+负值)。
1. 单元最短路径问题
1.1 BFS
(1)算法思路
对于无权图,可以通过一次BFS遍历就可以获得指定初始顶点的单源最短路径。同时相比于普通的BFS算法,需要另外维护d[N]和path[N]两个数组,用于保存与初始顶点间的最短路径以及在最短路径上的前缀顶点。
- 初始化数组d[N]和path[N]。
- 指定初始顶点并将对应最短距离设置为0.
- 层次遍历算法,在将邻近顶点加入队列前更新对应的距离和前缀数组。
#define INT_MAX 3fffffff
void BFS_MIN_DISTANCE(Gragh G, int v) {
// 初始化距离和前缀数组
for(int i=0; i<Gragh.vexnum; i++) {
v[i] = INT_MAX;
path[i] = -1;
}
// 更新初始顶点
d[v] = 0;
visited[v] = true;
Q.push(v);
// BFS
while(!Q.empty()) {
v = Q.pop();
for(w=FirstNeibor(G,v);w>=0;w=NextNeighbor(G,v,w)) {