C语言倒序遍历输出迪杰斯特拉算法的最短路径
时间: 2023-06-22 15:34:25 浏览: 103
首先需要明确迪杰斯特拉算法的最短路径是以一个起点为基础,经过各个节点到达指定终点的最短路径。因此,在正向遍历的过程中,需要记录下每个节点的前驱节点,以便在输出最短路径时能够还原整条路径。具体实现步骤如下:
1. 定义一个数组dist来记录起点到各个节点的最短距离,初始化为无穷大,起点的距离为0。
2. 定义一个数组pre来记录每个节点的前驱节点,初始化为-1。
3. 定义一个bool类型的数组visited来记录每个节点是否已经被访问过。
4. 从起点开始遍历所有节点,每次选取dist值最小的未访问节点进行访问。
5. 对于每个访问的节点,更新其相邻节点的dist值,更新前驱节点pre和visited数组。
6. 重复4-5步骤,直到所有节点都被访问过或者无法到达终点。
7. 根据pre数组反向遍历输出最短路径。
倒序遍历输出最短路径的代码示例:
```c
void printPath(int pre[], int endNode) {
int path[MAX_NODE];
int pathLen = 0;
int curNode = endNode;
while (curNode != -1) {
path[pathLen++] = curNode;
curNode = pre[curNode];
}
printf("Shortest path: ");
for (int i = pathLen - 1; i >= 0; i--) {
printf("%d ", path[i]);
}
}
void dijkstra(int graph[MAX_NODE][MAX_NODE], int startNode, int endNode) {
int dist[MAX_NODE];
int pre[MAX_NODE];
bool visited[MAX_NODE] = {false};
for (int i = 0; i < MAX_NODE; i++) {
dist[i] = INT_MAX;
pre[i] = -1;
}
dist[startNode] = 0;
for (int i = 0; i < MAX_NODE; i++) {
int minDist = INT_MAX;
int minNode = -1;
for (int j = 0; j < MAX_NODE; j++) {
if (!visited[j] && dist[j] < minDist) {
minDist = dist[j];
minNode = j;
}
}
if (minNode == -1) break;
visited[minNode] = true;
for (int j = 0; j < MAX_NODE; j++) {
if (graph[minNode][j] != INT_MAX && dist[minNode] + graph[minNode][j] < dist[j]) {
dist[j] = dist[minNode] + graph[minNode][j];
pre[j] = minNode;
}
}
}
printPath(pre, endNode);
}
```
其中,MAX_NODE为节点数的最大值,INT_MAX为int类型的最大值。需要注意的是,这里只是简单的实现示例,实际使用中需要根据具体情况进行修改和完善。
阅读全文