【发布时间】:2015-05-27 06:51:29
【问题描述】:
我需要通过 ADT 图实现 Dijkstra 算法,使用邻接矩阵表示,通过使用 C/C++ 语言增强下面的伪代码来找到最短路径。
procedure Dijkstra(G, w, r, Parent[0:n-1], Dist)
for v← 0 to n-1 do
Dist[v] ← ∞
InTheTree[v] ← .false.
endfor
Parent[r] ←-1
Dist[r] ←0
for Stage ←1 to n-1 do
Select vertex u that minimises Dist[u] over all u such that InTheTree[u] = .false.
InTheTree[u] = .true. // add u to T
for each vertex v such that uv ∈ E do // update Dist[v] and
if .not. InTheTree[v] then // Parent[v] arrays
if Dist[u] + w(uv) < Dist[v]
Dist[v] = Dist[u] + w(uv)
Nearest[v] ←w(uv)
Parent[v] ← u
endif
endif
endfor
endfor
end Dijkstra
这是我用 C++ 编写的代码解决方案。我的讲师声称代码不符合伪代码要求,我不确定 哪里出错了,谁能帮我找出代码和伪代码之间不匹配的地方?
#include <stdio.h>
#include <limits.h>
#define N 9
int minDistance(int dist[], bool sptSet[])
{
int min = INT_MAX, min_index;
for (int n = 0; n < N; n++)
if (sptSet[v] == false && dist[n] <= min)
min = dist[n], min_index = n;
return min_index;
}
int printSolution(int dist[], int v)
{
printf("Vertex Distance from Source\n");
for (int i = 0; i < N; i++)
printf("%d \t\t %d\n", i, dist[i]);
}
void dijkstra(int graph[N][N], int src)
{
int dist[N];
bool sptSet[N];
for (int i = 0; i < N; i++) {
dist[i] = INT_MAX;
sptSet[i] = false;
}
dist[src] = 0;
for (int count = 0; count < N-1; count++)
{
int u = minDistance(dist, sptSet);
sptSet[u] = true;
for (int n = 0; n < N; n++)
if (!sptSet[n] && graph[u][n] && dist[u] != INT_MAX
&& dist[u]+graph[u][n] < dist[n])
dist[n] = dist[u] + graph[u][n];
}
printSolution(dist, N);
}
int main()
{
int graph[N][N] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},
{4, 0, 8, 0, 0, 0, 0, 11, 0},
{0, 8, 0, 7, 0, 4, 0, 0, 2},
{0, 0, 7, 0, 9, 14, 0, 0, 0},
{0, 0, 0, 9, 0, 10, 0, 0, 0},
{0, 0, 4, 0, 10, 0, 2, 0, 0},
{0, 0, 0, 14, 0, 2, 0, 1, 6},
{8, 11, 0, 0, 0, 0, 1, 0, 7},
{0, 0, 2, 0, 0, 0, 6, 7, 0}
};
dijkstra(graph, 0);
return 0;
}
【问题讨论】:
-
最近的[v] ←????(????????) = 最近的[v] ←w(uv)
-
不是问题,但通常你会把
for (int i = 0; i < N; i++) dist[i] = INT_MAX, sptSet[i] = false;写成for (int i = 0; i < N; i++) {dist[i] = INT_MAX; sptSet[i] = false;};逗号运算符通常不仅仅用于将多个语句放在一行中。 -
@SJuan76 谢谢,我已经进行了相应的编辑。问题是,这段代码与它看起来的伪代码不匹配。我想知道它不匹配的部分。
-
目前,代码无法编译。
sptSet[i] = false;在 for 循环之外(这就是为什么我告诉大家总是放 {},即使里面有单行语句。 -
问题一:需要实现
nearest和parent吗?问题2:是否需要使用优先级队列(最小堆)?