路径规划中我只想要两条路径的c++代码,并给出注释
时间: 2024-06-11 17:10:21 浏览: 14
以下是一种基于Dijkstra算法的实现方式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_NODES 100 // 最大节点数
// 邻接矩阵表示图
int graph[MAX_NODES][MAX_NODES];
int num_nodes;
// Dijkstra算法求最短路径
void dijkstra(int start, int dist[], int prev[]) {
int visited[MAX_NODES] = {0}; // 标记节点是否已访问
for (int i = 0; i < num_nodes; i++) {
dist[i] = INT_MAX; // 初始距离设为无限大
prev[i] = -1; // 初始前驱节点设为-1
}
dist[start] = 0; // 起始节点的距离为0
for (int i = 0; i < num_nodes; i++) {
// 找到未访问节点中距离最小的节点
int min_dist = INT_MAX;
int min_node = -1;
for (int j = 0; j < num_nodes; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_node = j;
}
}
if (min_node == -1) {
break; // 所有节点都已访问
}
visited[min_node] = 1; // 标记为已访问
// 更新未访问节点的距离和前驱节点
for (int j = 0; j < num_nodes; j++) {
if (!visited[j] && graph[min_node][j] > 0) {
int new_dist = dist[min_node] + graph[min_node][j];
if (new_dist < dist[j]) {
dist[j] = new_dist;
prev[j] = min_node;
}
}
}
}
}
int main() {
int start, end;
scanf("%d%d", &start, &end);
// 读入图的边和节点数
int num_edges;
scanf("%d%d", &num_nodes, &num_edges);
// 初始化邻接矩阵
for (int i = 0; i < num_nodes; i++) {
for (int j = 0; j < num_nodes; j++) {
graph[i][j] = -1; // -1表示没有边相连
}
}
// 读入每条边的信息
for (int i = 0; i < num_edges; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
graph[u][v] = w;
graph[v][u] = w; // 无向图需要反向边
}
// 求最短路径
int dist[MAX_NODES], prev[MAX_NODES];
dijkstra(start, dist, prev);
// 输出路径和距离
int path[MAX_NODES], len = 0;
int node = end;
while (node != -1) {
path[len++] = node;
node = prev[node];
}
printf("%d", dist[end]);
printf("%d", path[len-1]);
for (int i = len-2; i >= 0; i--) {
printf("-%d", path[i]);
}
printf("\n");
// 求次短路径
int second_dist = INT_MAX;
for (int i = 0; i < len-1; i++) {
// 枚举每条边(u,v)
int u = path[i], v = path[i+1];
int w = graph[u][v];
// 临时删除边(u,v)
graph[u][v] = -1;
graph[v][u] = -1;
// 重新求最短路径
dijkstra(start, dist, prev);
// 恢复边(u,v)
graph[u][v] = w;
graph[v][u] = w;
// 更新次短路径
if (dist[end] < second_dist) {
second_dist = dist[end];
}
}
printf("%d", second_dist);
printf("%d", path[len-1]);
for (int i = len-2; i >= 0; i--) {
printf("-%d", path[i]);
}
printf("\n");
return 0;
}
```
注释如下:
- 第7行:定义邻接矩阵表示图。
- 第8行:定义节点数。
- 第11-15行:定义Dijkstra算法求最短路径的函数。
- 第17-21行:定义visited数组,标记节点是否已访问。
- 第22-26行:初始化dist和prev数组。
- 第27行:起始节点的距离为0。
- 第28-37行:重复执行num_nodes次,每次找到未访问节点中距离最小的节点,标记为已访问,更新未访问节点的距离和前驱节点。
- 第39行:主函数开始。
- 第40-41行:读入起点和终点。
- 第43-45行:读入图的边和节点数。
- 第47-53行:初始化邻接矩阵,全部设为-1表示没有边相连。
- 第55-62行:读入每条边的信息,存入邻接矩阵。
- 第64-66行:求起点到终点的最短路径。
- 第68-72行:输出路径和距离,先输出距离,再输出路径。
- 第74行:求起点到终点的次短路径。
- 第75行:定义second_dist表示次短路径的距离,初始化为无限大。
- 第76-99行:枚举每条边(u,v),临时删除边(u,v),重新求最短路径,恢复边(u,v),更新次短路径。
- 第101-107行:输出次短路径和距离,与最短路径的输出方式相同。
- 第109行:结束程序。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)