问题:对任意给出的图G(V,E)和起点S、终点T,如何求从S到T的最短路径。
解法:解决最短路径问题的常用算法有 Dijkstra算法、Bellman-Ford 算法、SPFA算法和Floyd算法。
Dijkstra算法思想:
对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合 V-S 中选择与起点s 的最短距离最小的一个顶点(记为 u),访问并加入集合 S。之后,令顶点u 为中介点,更新起点 s 与所有从u 能到达的顶点v之间的最短距离。这样的操作执行 n次(n为顶点个数),直到集合 S已包含所有顶点。
代码:
void dijkstra() {
// 初始化
Arrays.fill(vis, false);
Arrays.fill(dist, INF);//dist[i]:顶点i到起点s的距离
// 起点s
dist[s] = 0;
// 操作执行n次(n为顶点个数),直到集合 S已包含所有顶点。
for (int p = 1; p <= n; p++) {
// 从V-S集合(vis[i]==false)中找到距离最近的点
int u = -1;
for (int i = 1; i <= n; i++) {
if (!vis[i] && (u == -1 || dist[i] < dist[u])) u = i;
}
// u加入集合S,更新最短距离
vis[u] = true;
for (int i = 1; i <= n; i++) {
dist[i] = Math.min(dist[i], dist[u] + w[u][i]);
}
}
}