从图的起点( s )开始, 首先标记起点( s )到本身的距离为 0( dist[s] = 0 ), 而后将起点到其余点的距离( dist[i] )赋初值, 若不连通则( dist[i] = MAX), MAX = 999. 算法
用迭代的方式, 从未访问点中找出最近的点( u ), 访问该点( visited[u] = true ), 并从点( u )出发, 更新起点到全部未访问点的最短路径.spa
迭代至图中全部点都被访问 visited[i] = true, 此时即已经求出了起点( s )到其余点的最短路径code
// 顶点到其余点的距离 int dist[] = new int[4]; // 该路径的直接前继 int prev[] = new int[4];; // 该点是否被访问 boolean visited[] = new boolean[4];; // 两点之间不连通的权重值 int MAX = 999; public void dijkstra(int s, int g[][]) { // 初始化 for (int i = 0; i < g.length; i++) { dist[i] = g[s][i]; // 为每条路径赋初值 visited[i] = false; // 初始时, 每一个点都未访问 if (dist[i] == MAX) { // 顶点到i不连通, prev[i] = -1 prev[i] = -1; } else { // 起点到i点联通, 设置该点的直接前继为起点 s, prev[i] = s prev[i] = s; } } dist[s] = 0; // 设置起点到本身的距离为0 visited[s] = true; // 顶点已被访问 for (int i = 1; i < g.length; i++) { int min = MAX; int u = s; for (int j = 1; j < g.length; j++) { // 从未访问点中找出最近的点( u ) if (!visited[j] && dist[j] < min) { min = dist[j]; u = j; } } visited[u] = true; // 从点( j )出发, 更新起点到全部未访问点的最短路径 for (int j = 1; j < g.length; j++) { if (!visited[j] && dist[j] > g[s][u] + g[u][j]) { dist[j] = g[s][u] + g[u][j]; prev[j] = u; } } } }
Dijkstra 算法是目前最快的单源最短路径算法, 其算法时间复杂度为 O(n^2)it