Dijkstra 最短路径算法的 C / C++ 程序
cc++server side programmingprogramming
我们给定一个图,图中有一个源顶点。我们必须找到从源顶点到图中所有其他顶点的最短路径。
Dijikstra 算法是一种贪婪算法,用于查找从图的源顶点到图的根节点的最短路径。
算法
步骤 1:创建一个集合 shortPath 来存储最短路径树中遇到的顶点。 步骤 2:将所有距离值初始化为 INFINITE,并将源顶点的距离值指定为 0,以便首先选择它。 步骤 3:循环,直到图的所有顶点都在 shortPath 中。 步骤 3.1:取一个未访问且最近的新顶点。 步骤 3.2:将此顶点添加到短路径。 步骤 3.3:对于此顶点的所有相邻顶点,更新距离。现在检查 V 的每个相邻顶点,如果 u 的距离和边的权重之和小于,则更新它。
基于此算法,让我们创建一个程序。
示例
#include <limits.h> #include <stdio.h> #define V 9 int minDistance(int dist[], bool sptSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; return min_index; } int printSolution(int dist[], int n) { printf("顶点与源的距离\n"); for (int i = 0; i < V; i++) printf("%d \t %d\n", i, dist[i]); } void dijkstra(int graph[V][V], int src) { int dist[V]; bool sptSet[V]; for (int i = 0; i < V; i++) dist[i] = INT_MAX, sptSet[i] = false; dist[src] = 0; for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, sptSet); sptSet[u] = true; 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, V); } int main() { int graph[V][V] = { { 0, 6, 0, 0, 0, 0, 0, 8, 0 }, { 6, 0, 8, 0, 0, 0, 0, 13, 0 }, { 0, 8, 0, 7, 0, 6, 0, 0, 2 }, { 0, 0, 7, 0, 9, 14, 0, 0, 0 }, { 0, 0, 0, 9, 0, 10, 0, 0, 0 }, { 0, 0, 6, 14, 10, 0, 2, 0, 0 }, { 0, 0, 0, 0, 0, 2, 0, 1, 6 }, { 8, 13, 0, 0, 0, 0, 1, 0, 7 }, { 0, 0, 2, 0, 0, 0, 6, 7, 0 } }; dijkstra(graph, 0); return 0; }
输出
顶点与源的距离 0 0 1 6 2 14 3 21 4 21 5 11 6 9 7 8 8 15