赞
踩
算法原理:
Dijkstra算法是一种经典的用于计算单源最短路径的算法。它可以在带权重的图中找到从源节点到所有其他节点的最短路径。Dijkstra算法通过贪心策略,不断选择当前已知最短路径最小的节点,更新其邻接节点的路径长度,直到处理完所有节点。
适用场景:
算法步骤:
实现步骤:
伪代码:
function Dijkstra(Graph, source): dist[source] = 0 create priority queue Q for each vertex v in Graph: if v ≠ source: dist[v] = infinity prev[v] = undefined Q.add_with_priority(v, dist[v]) while Q is not empty: u = Q.extract_min() for each neighbor v of u: alt = dist[u] + length(u, v) if alt < dist[v]: dist[v] = alt prev[v] = u Q.decrease_priority(v, alt) return dist, prev
C语言代码:
#include <stdio.h> #include <stdlib.h> #include <limits.h> #define V 9 // 图中的顶点数 // 寻找当前未访问节点中距离最小的节点 int minDistance(int dist[], int sptSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) { if (sptSet[v] == 0 && dist[v] <= min) { min = dist[v], min_index = v; } } return min_index; } // 打印从源节点到所有其他节点的最短路径 void printSolution(int dist[]) { printf("Vertex \t Distance from Source\n"); for (int i = 0; i < V; i++) { printf("%d \t\t %d\n", i, dist[i]); } } // 实现Dijkstra算法 void dijkstra(int graph[V][V], int src) { int dist[V]; // 存储源节点到其他节点的最短距离 int sptSet[V]; // 标记节点是否已被处理 // 初始化所有节点的最短距离为无穷大,sptSet为未访问状态 for (int i = 0; i < V; i++) { dist[i] = INT_MAX, sptSet[i] = 0; } dist[src] = 0; // 遍历所有节点 for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, sptSet); sptSet[u] = 1; // 更新节点的最短路径 for (int v = 0; v < V; v++) { if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } printSolution(dist); } int main() { int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0}, {4, 0, 8, 0, 0, 0, 0, 11, 0}, {0, 8, 0, 7, 0, 4, 0, 0, 2}, {0, 0, 7, 0, 9, 14, 0, 0, 0}, {0, 0, 0, 9, 0, 10, 0, 0, 0}, {0, 0, 4, 14, 10, 0, 2, 0, 0}, {0, 0, 0, 0, 0, 2, 0, 1, 6}, {8, 11, 0, 0, 0, 0, 1, 0, 7}, {0, 0, 2, 0, 0, 0, 6, 7, 0}}; dijkstra(graph, 0); return 0; }
代码解释:
int minDistance(int dist[], int sptSet[])
:找到未访问节点中距离最小的节点。void printSolution(int dist[])
:打印从源节点到所有其他节点的最短路径。void dijkstra(int graph[V][V], int src)
:实现Dijkstra算法,从源节点计算到所有其他节点的最短路径。int main()
:主函数,定义图的邻接矩阵并调用Dijkstra算法计算最短路径。算法特点:
通过上述代码和解释,读者应该可以理解Dijkstra算法的原理和实现步骤,并在实际应用中使用该算法计算最短路径。对于考研初试,只需掌握手算方法,我们以东南大学2000年真题为例进行讲解:
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | ∞ | - |
c | ∞ | - |
d | ∞ | - |
e | ∞ | - |
f | ∞ | - |
g | ∞ | - |
选择距离最小的节点a,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 12 | a |
e | ∞ | - |
f | ∞ | - |
g | ∞ | - |
选择距离最小的节点c,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 12 | a |
e | 10 | c |
f | 6 | c |
g | ∞ | - |
选择距离最小的节点f,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 11 | f |
e | 10 | c |
f | 6 | c |
g | 16 | f |
选择距离最小的节点e,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 11 | f |
e | 10 | c |
f | 6 | c |
g | 16 | f |
选择距离最小的节点d,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 11 | f |
e | 10 | c |
f | 6 | c |
g | 13 | d |
选择距离最小的节点g,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 11 | f |
e | 10 | c |
f | 6 | c |
g | 13 | d |
选择距离最小的节点b,更新其邻接节点的距离。
节点 | 距离 | 前驱 |
---|---|---|
a | 0 | - |
b | 15 | a |
c | 2 | a |
d | 11 | f |
e | 10 | c |
f | 6 | c |
g | 13 | d |
最终结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。