路径规划中我只想要两条路径的c++代码
时间: 2024-05-03 16:21:57 浏览: 7
以下是一种简单的方法,使用 Dijkstra 算法来计算两条最短路径:
```
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 1005;
const int INF = 1e9;
struct Edge {
int to, w;
};
vector<Edge> graph[MAXN];
int dist[MAXN];
int parent[MAXN];
void dijkstra(int s) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
memset(dist, INF, sizeof(dist));
dist[s] = 0;
pq.push(make_pair(0, s));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
for (int i = 0; i < graph[u].size(); i++) {
int v = graph[u][i].to;
int w = graph[u][i].w;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v));
parent[v] = u;
}
}
}
}
int main() {
int n, m, s, t;
cin >> n >> m >> s >> t;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, w});
graph[v].push_back({u, w});
}
dijkstra(s);
int path1[MAXN], path2[MAXN], len1 = 0, len2 = 0;
int cur = t;
while (cur != s) {
path1[len1++] = cur;
cur = parent[cur];
}
path1[len1++] = s;
reverse(path1, path1 + len1);
dijkstra(t);
cur = s;
while (cur != t) {
path2[len2++] = cur;
cur = parent[cur];
}
path2[len2++] = t;
reverse(path2, path2 + len2);
cout << "Path 1: ";
for (int i = 0; i < len1; i++) {
cout << path1[i];
if (i < len1 - 1) cout << " -> ";
}
cout << endl;
cout << "Path 2: ";
for (int i = 0; i < len2; i++) {
cout << path2[i];
if (i < len2 - 1) cout << " -> ";
}
cout << endl;
return 0;
}
```
该代码首先读取输入并构建邻接表表示的图。然后运行两次 Dijkstra 算法,一次从起点到终点,一次从终点到起点。
在计算两次最短路径时,我们记录每个节点的父节点,以便后续从终点向起点回溯路径。最后,我们将两个路径打印出来。
请注意,如果两条路径中存在公共路径,则此代码将忽略该路径并选择两个独立的路径。如果需要包括公共路径,则需要在计算第二条路径时使用 Dijkstra 算法,并记录每个节点的距离和两个父节点,以便在回溯路径时合并公共路径。