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

相关文章