使用基于c语言或者c++的迪杰斯特拉算法实现应用题的第六章第四小题。
如有向图6.35 试用迪杰斯特拉算法求出顶点a到其他各个顶点的最短路径。
图略
我们不妨假设一下有向图 无特殊含义只是笔者为了简便
a=0
b=1
c=3
e=2
g=4
f=5
d=6
我们可以给出代码
// 引入必要的头文件
#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
// 定义一个整数对类型,方便后续使用
typedef pair<int, int> iPair;
// 添加边到邻接列表中
void addEdge(vector<pair<int, int>> adj[], int u, int v, int w) {
adj[u].push_back(make_pair(v, w)); // 将顶点v和权重w添加到顶点u的邻接列表中
}
// 使用Dijkstra算法计算从源点到所有其他顶点的最短路径
void dijkstra(vector<pair<int, int>> adj[], int V, int src) {
priority_queue<iPair, vector<iPair>, greater<iPair>> pq; // 定义一个小顶堆,用于存放待处理的顶点及其当前距离
vector<int> dist(V, numeric_limits<int>::max()); // 初始化所有顶点到源点的距离为最大值
dist[src] = 0; // 源点到自身的距离为0
pq.push(make_pair(0, src)); // 将源点和其距离0放入小顶堆中
while (!pq.empty()) { // 当小顶堆不为空时,循环进行以下操作
int u = pq.top().second; // 取出当前距离最小的顶点u
pq.pop(); // 从堆中移除顶点u
// 遍历顶点u的所有邻居
for (auto x : adj[u]) {
int v = x.first; // 邻居顶点v
int weight = x.second; // 边权重
// 如果通过u到v的路径比已知的路径更短,则更新v的距离,并将v加入堆中
if (dist[v] > dist[u] + weight) {
dist[v] = dist[u] + weight;
pq.push(make_pair(dist[v], v));
}
}
}
// 打印所有顶点到源点的最短距离
cout << "Vertex \t\t Distance from Source" << endl;
for (int i = 0; i < V; ++i) {
cout << i << "\t\t" << dist[i] << endl;
}
}
int main() {
int V = 7; // 图中的顶点数
vector<pair<int, int>> adj[V]; // 使用邻接列表表示图
// 添加图中的边,格式为:起点、终点、权重
addEdge(adj, 0, 1, 15);
addEdge(adj, 0, 3, 2);
addEdge(adj, 0, 6, 12);
addEdge(adj, 1, 2, 6);
addEdge(adj, 2, 4, 4);
addEdge(adj, 3, 2, 8);
addEdge(adj, 3, 5, 4);
addEdge(adj, 4, 1, 4);
addEdge(adj, 5, 4, 10);
addEdge(adj, 5, 6, 5);
addEdge(adj, 6, 4, 3);
dijkstra(adj, V, 0); // 从顶点0开始计算到所有其他顶点的最短路径
return 0;
}