利用有向网的邻接表存储结构实现Dijkstra算法的最短路径主函数
时间: 2024-03-20 13:43:48 浏览: 53
好的,以下是利用有向网的邻接表存储结构实现Dijkstra算法的最短路径主函数的代码示例:
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 1005; // 网络中最多有1005个顶点
const int INF = 0x3f3f3f3f; // 表示无穷大
struct Edge {
int to, w; // 边的终点和权值
int next; // 指向下一条边的指针
} edge[MAXN]; // 边的数组
int head[MAXN], cnt; // 邻接表头指针和边的计数器
int dis[MAXN]; // 存储最短路径长度
bool vis[MAXN]; // 标记数组,判断是否访问过
void addEdge(int u, int v, int w) {
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
void dijkstra(int s, int n) {
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>>> pq;
pq.push(make_pair(dis[s], s)); // 将起点加入优先队列
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (vis[u]) continue; // 如果该点已经访问过,则继续下一个点
vis[u] = true;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
int w = edge[i].w;
if (dis[v] > dis[u] + w) { // 如果起点经过u到v的距离比以前更短
dis[v] = dis[u] + w;
pq.push(make_pair(dis[v], v));
}
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入顶点个数和边数
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w; // 输入边的起点,终点和权值
addEdge(u, v, w); // 加入邻接表
}
dijkstra(1, n); // 求起点到其他所有点的最短路径
for (int i = 1; i <= n; i++) {
cout << dis[i] << " ";
}
cout << endl;
return 0;
}
```
这段代码实现了Dijkstra算法的主要功能,即求起点到其他所有点的最短路径长度。它利用邻接表存储有向网,然后通过一个优先队列来按照距离从小到大的顺序遍历所有的点,计算最短路径长度。
阅读全文