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