C 在dijstra算法中打印路径

C 在dijstra算法中打印路径,c,dijkstra,shortest-path,C,Dijkstra,Shortest Path,我的cs教授给了我一个dijstras算法的实现,他要求我们修改它以打印从源节点src see代码到每个节点的路径,以及它已经完成的距离。我已经看了大约一个星期了,并且尝试了几种方法。我一辈子都想不出来。。。任何帮助都将不胜感激。该图由邻接矩阵表示,并且有一个包含其大小的全局图: int n; //Global matrix's size int minDistance(int dist[], bool sptSet[]){ // Initialize min value int

我的cs教授给了我一个dijstras算法的实现,他要求我们修改它以打印从源节点src see代码到每个节点的路径,以及它已经完成的距离。我已经看了大约一个星期了,并且尝试了几种方法。我一辈子都想不出来。。。任何帮助都将不胜感激。该图由邻接矩阵表示,并且有一个包含其大小的全局图:

int n; //Global matrix's size
int minDistance(int dist[], bool sptSet[]){
    // Initialize min value
    int min = INT_MAX, min_index;
    int i = 0;
    for ( i = 0; i < n; i++)
        if (sptSet[i] == false && dist[i] <= min)
            min = dist[i], min_index = i; 
   return min_index;
}

int printSolution(int dist[]){
   printf("Vertex   Distance from Source\n");
   int i;
   for (i = 0; i < n; i++)
      printf("%d \t\t %d\n", i, dist[i]);
}

void dijkstra(int ** graph, int src){
    //correting zeros (won't work with negative values)
    correctZeros(graph);
    int dist[n]; 
    bool sptSet[n];
    int i;
    for (i = 0; i < n; i++)
        dist[i] = INT_MAX, sptSet[i] = false;
    dist[src] = 0;

    // Find shortest path for all vertices
    int count;
    for (count = 0; count < n; count++){
        int u = minDistance(dist, sptSet);
        sptSet[u] = true;
        int j;
        for (j = 0; j < n; j++){
            printf("%d", u);
            if (!sptSet[j] && graph[u][j] && dist[u] != INT_MAX && dist[u]+graph[u][j] < dist[j]){
                dist[j] = dist[u] + graph[u][j];

            }
        }
    }
    printSolution(dist);
}

您所需要做的就是为每个节点存储最短路径的下一跳。每当更新节点最短路径的距离时,此信息都将更新。

在执行松弛计算时,使用另一个数组存储上一个节点

node[src] = src; //init source node
if (!sptSet[j] && graph[u][j] && dist[u] != INT_MAX && dist[u]+graph[u][j] < dist[j]){
            dist[j] = dist[u] + graph[u][j];
            node[j] = u; //store previous node step
        }
我不太熟悉C语言,所以可能有一些C语法错误。谢谢

printPath(int node[], int i, int src)
{

    int currentNode = i;
    printf(currentNode); 
    while(currentNode!=src)
    {
         printf(node[currentNode]);
         currentNode = node[currentNode];
    }
}