改为使用迪杰斯特拉算法
时间: 2024-09-24 15:00:35 浏览: 30
最短路问题迪杰斯特拉算法PPT课件.pptx
如果你想使用迪杰斯特拉(Dijkstra's Algorithm)来寻找从起始点 A 到其余站点的最短路径,你需要对 `Pathway` 函数进行一些调整。迪杰斯特拉是一种用于解决单源最短路径问题的有效算法,适合于边权重非负的情况。
首先,我们需要维护一个优先队列(如用 std::priority_queue 实现),存储待处理的节点及其到起点 A 的距离。然后,在每次迭代中,我们会选择距离最小的节点,并更新其相邻节点的距离,直到遍历完所有节点或者找到目标节点。
以下是修改后的 `Pathway` 函数:
```cpp
#include <queue>
#include <vector>
using namespace std;
struct Node {
int id;
int distance;
bool visited;
Node(int _id, int _distance) : id(_id), distance(_distance), visited(false) {}
};
vector<int> adj[26]; // 邻接表,存储每个节点的邻居及对应距离
int dist[26]; // 存储从 A 到每个节点的距离
Node priorityQueue[26]; // 优先队列,用数组代替是因为这里只有26个节点
void dijkstra() {
priorityQueue[0].distance = 0; // 设定起点A的初始距离为0
priorityQueue[0].visited = true;
while (!priorityQueue[0].visited) {
int u = min_element(priorityQueue, priorityQueue + 26, [](const Node& a, const Node& b) {
return a.distance < b.distance;
}) - priorityQueue; // 选取距离最小的节点u
if (u == 1) break; // 如果找到目标节点B,提前终止
priorityQueue[u].visited = false; // 标记节点u已访问
for (auto& v : adj[u]) {
int newDist = dist[u] + pre[u][v]; // 计算新的节点v距离
if (newDist < dist[v]) { // 如果新距离更小
dist[v] = newDist;
priorityQueue[v].distance = newDist;
priorityQueue[v].visited = true; // 更新节点v的信息并标记为未访问
}
}
}
}
void printPaths() {
for (int i = 1; i < 26; i++) {
if (dist[i] != INT_MAX) { // 如果找到了从A到i的路径
printf("%c-%.*s %d\n", station[A], (int)strlen(station) - 1 - i, station + i, dist[i]);
} else {
printf("%c-%s not found\n", station[A], station + i); // 如果找不到路径,输出提示
}
}
}
int main() {
// ... 其他初始化部分 ...
dijkstra(); // 运行迪杰斯特拉算法
printPaths(); // 输出最短路径和距离
return 0;
}
```
这次改动后,我们使用了优先队列和邻接列表来优化查找过程。迪杰斯特拉算法会在每一步都找出当前阶段下离起点最近的未探索节点,这样可以保证找到的是局部最优解。最后,`printPaths` 函数会根据 `dist[]` 数组打印出最短路径和距离。
阅读全文