请设计void Dijkstra(Graph g, int s, int D[], int P[])函数。 该函数计算编号为s的顶点到所有顶点的最短路径长度及最短路径。 如果顶点不可达,则最短路径为INT_MAX。 数组D[]记录顶点s到对应顶点的最短距离(s到s的最短路径长度为0) 数组P[]记录顶点s到对应顶点的最短路径上的前驱(s到s的前驱为s)。 请注意,本题有预置代码,只需提交所要求的函数定义代码即可。
时间: 2024-03-21 10:39:10 浏览: 48
以下是Dijkstra函数的代码实现:
```c++
void Dijkstra(Graph g, int s, int D[], int P[]) {
const int n = g.getNumOfVertex();
vector<bool> visited(n, false);
fill(D, D + n, INT_MAX);
fill(P, P + n, -1);
D[s] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || D[j] < D[u])) {
u = j;
}
}
visited[u] = true;
for (auto& e : g.getOutGoingEdges(u)) {
int v = e.to;
if (!visited[v] && D[u] + e.weight < D[v]) {
D[v] = D[u] + e.weight;
P[v] = u;
}
}
}
}
```
该函数采用了Dijkstra算法来计算从起点s到所有顶点的最短路径长度及最短路径。函数首先初始化各数组(D数组、P数组、visited数组),然后将起点s的最短路径长度设为0。之后,每次从未访问过的顶点中选取距离起点最近的顶点,将该顶点标记为已访问,并更新起点到其它未访问顶点的最短距离及最短路径。最终,D数组中记录了起点s到各顶点的最短距离,P数组中记录了起点s到各顶点的最短路径上的前驱。如果顶点不可达,则最短路径为INT_MAX。
阅读全文