武汉地铁站点最短路径搜索的实现(一)——Dijkstra算法(C++ coding)
时间: 2023-11-13 09:06:03 浏览: 35
好的,我来回答你的问题。
首先,Dijkstra算法是解决最短路径问题的一种经典算法,可以用于求解武汉地铁站点之间的最短路径。以下是使用C++实现Dijkstra算法的代码示例:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int n, m; // n表示点的个数,m表示边的个数
int dis[MAXN]; // 存储起点到各个点的最短距离
bool vis[MAXN]; // 标记是否已经确定最短距离
struct Edge {
int to; // 边的终点
int w; // 边的权值
};
vector<Edge> g[MAXN]; // 存储图的邻接表
void dijkstra(int start) {
// 初始化
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
dis[start] = 0;
// 优先队列用于按照距离从小到大选择下一个点
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push(make_pair(dis[start], start));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (vis[u]) {
continue;
}
vis[u] = true;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].to;
int w = g[u][i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
pq.push(make_pair(dis[v], v));
}
}
}
}
int main() {
cin >> n >> m;
// 读入边
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back(Edge{v, w});
}
// 求解
dijkstra(1);
// 输出结果
for (int i = 1; i <= n; i++) {
cout << dis[i] << " ";
}
cout << endl;
return 0;
}
```
以上代码的主要思路是:首先初始化起点到各个点的距离为无穷大,然后每次选择一个距离最小的点进行松弛操作,即更新与该点相邻的点的距离,并将其加入优先队列中。最终得到起点到各个点的最短距离。
希望能帮助到你!