📜  Dijkstra 在 C 中的算法代码 (1)

📅  最后修改于: 2023-12-03 15:00:24.862000             🧑  作者: Mango

Dijkstra 在 C 中的算法代码

Dijkstra 算法是一种用于计算图中从一个源节点到其它所有节点的最短路径的算法。它是一种贪心算法,通过不断的松弛最小距离来得到最短路径。

以下是 Dijkstra 在 C 中的算法代码:

#include <stdio.h>
#include <limits.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;
}

void printSolution(int dist[])
{
    printf("Vertex   Distance from Source\n");
    for (int i = 0; i < V; i++)
        printf("%d \t\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);
}

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;
}
解释说明
  • V 是我们的图中节点的数量。
  • minDistance 函数返回一个距离数组 dist 中未被包含在 sptSet 数组中并且距离最小的节点。
  • printSolution 函数用于打印结果。
  • dijkstra 函数是我们的 Dijkstra 算法主函数。在这里,我们通过 graph 数组来表示我们的图,距离数组 dist 表示所有节点到源节点的距离,sptSet 表示包含在我们当前的最短路径树中的节点。在函数中,我们首先将 dist[src] 设置为 0,然后在每一次循环中找到距离当前最近的未被包含在最短路径树中的节点并将它加入到 sptSet 数组中。对于每个还没有包含在 sptSet 中的节点,我们比较该节点到源节点的距离是否要小于当前记录的距离,如果小于,我们更新距离数组的值为当前更小的值。最后,我们通过调用 printSolution 函数在控制台上打印出最短路径的结果。

这是一段非常短小精悍的代码,但是它确实能够在很短的时间内找到从一个节点到图中所有节点的最短路径。