请写出用邻接表写的迪杰斯特拉算法模板
时间: 2023-10-02 20:06:26 浏览: 89
下面是用邻接表实现的迪杰斯特拉算法模板:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 1005; // 最大顶点数
const int INF = 0x3f3f3f3f; // 无穷大
struct Edge {
int to, w;
Edge(int to, int w): to(to), w(w) {}
};
vector<Edge> G[MAXN]; // 邻接表存图
int dis[MAXN]; // 从源点到各个顶点的最短距离
bool vis[MAXN]; // 记录每个顶点是否已经被访问过
void dijkstra(int s) {
memset(dis, INF, sizeof(dis)); // 初始化最短距离为无穷大
memset(vis, false, sizeof(vis)); // 初始化所有顶点为未访问过
dis[s] = 0; // 源点到自己的距离为0
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
q.push(make_pair(0, s)); // 将源点加入到优先队列中
while (!q.empty()) {
int u = q.top().second; // 取出当前距离最短的顶点
q.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; // 更新最短距离
q.push(make_pair(dis[v], v)); // 将更新后的顶点加入到优先队列中
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s;
// 读入图的边
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
G[u].push_back(Edge(v, w)); // 添加一条从u到v,权值为w的边
}
dijkstra(s); // 进行最短路径计算
// 输出每个顶点到源点的最短距离
for (int i = 1; i <= n; i++) {
if (dis[i] == INF) cout << "INF" << endl;
else cout << dis[i] << endl;
}
return 0;
}
```
阅读全文