由顶点和边组成的图,使用A*路径规划算法,实现从起点到终点的最短路径查找:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <climits>
#include <map>
using namespace std;
const int INF = INT_MAX;
class Graph {
private:
map<int, vector<pair<int, int>>> adj; // 使用map表示邻接表
int V;
public:
Graph(int vertices) : V(vertices) {}
void addEdge(int u, int v, int weight) {
adj[u].push_back(make_pair(v, weight)); // 添加边到邻接表
}
vector<int> shortestPath(int start, int end) {
vector<int> dist(V, INF); // 初始化距离数组为无穷大
vector<int> prev(V, -1); // 初始化前驱数组为-1
dist[start] = 0; // 起始点到自身的距离为0
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push(make_pair(0, start)); // 将起始点加入优先队列
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
for (auto edge : adj[u]) {
int v = edge.first;
int weight = edge.second;
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
prev[v] = u;
pq.push(make_pair(dist[v], v));
}
}
}
vector<int> path;
for (int at = end; at != -1; at = prev[at]) {
path.push_back(at);
}
reverse(path.begin(), path.end());
return path;
}
};
int main() {
Graph g(6);
g.addEdge(0, 1, 5);
g.addEdge(0, 2, 3);
g.addEdge(1, 3, 6);
g.addEdge(1, 4, 2);
g.addEdge(2, 1, 1);
g.addEdge(2, 4, 4);
g.addEdge(3, 5, 7);
g.addEdge(4, 3, 1);
g.addEdge(4, 5, 3);
int start = 0;
int end = 5;
vector<int> path = g.shortestPath(start, end);
cout << "Shortest path from " << start << " to " << end << " is: ";
for (int i = 0; i < path.size(); ++i) {
cout << path[i];
if (i < path.size() - 1) {
cout << " -> ";
}
}
cout << endl;
return 0;
}
输出结果为:Shortest path from 0 to 5 is: 0 -> 2 -> 1 -> 4 -> 5