1. 问题
分别用Floyd、Dijkstra算法求两个顶点间的最短距离
**
2.解析
Floyd:
算法Dk[i][j] = 路径{ i {lk}j }的最小长度
D0,D1,…,D|V|-1[i][j]即给出了i到j的真正最短距离
最初的D-1是什么?
当Dk-1已经完成,递推到Dk时:或者k最短路径{i{lk}j},则Dk =Dk-1或者k 最短路径{i {lk}j },则该路径必定由两段最短路径组成:Dk[i][j]=Dk1[i][k]+Dk1[k][j]
Dijkstra:
算法令S={源点s+已经确定了最短路径的顶点vi}对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过S中的顶点。即路径{s(viS)v}的最小长度
**
**
3.设计(伪代码)
void Floyd() {
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
D[i][j] = G[i][j];
path[i][j] = -1;
}
for (k = 0; k < N; k++) {
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (D[i][k] + D[k][i] < D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
path[i][j] = k;
}
}
}
}
}
}
**
Dijktra
void Dijkstra(Vertex s) {
while (1) {
v = 未收录顶点中dist最小者;
if(这样的v不存在)
break;
collected[v] = true;
for(v的每个邻接点w)
if(collected[w]==false)
if (dist[v] + E(e, w) < dist[w]) {
dist[w] = dist[v] + E(v, w);
path[w] = v;
}
}
}
**