根据您提供的代码,有几个问题需要修复:
在函数
Dijkstra
中,第一个 for 循环应该从 0 开始遍历到graph.GetVexNum() - 1
,而不是graph.GetVexNum()
。因为顶点索引是从 0 开始的。在第一个 for 循环内部的 if 语句中,设置了初始路径
path[v] = v0;
。但在后续循环中,并没有更新这个初始值,导致最短路径可能无法正确计算。可以将这行代码移动到第一个 for 循环之前。在函数
OutputShortestPath
中,使用了未定义的变量endl
,应该改为使用换行符\n
。
修正后的代码如下所示:
void Dijkstra(ALDirNetwork<char, int>& graph, int v0, int* dist, int* path)
{
int mindist, infinity = graph.GetInfinity();
int v, u;
for (v = 0; v < graph.GetVexNum(); v++) {
dist[v] = graph.GetWeight(v0, v);
if (dist[v] == infinity) path[v] = -1;
else path[v] = v0;
}
graph.SetVisitedTag(v0, VISITED);
for (int i = 1; i < graph.GetVexNum(); i++) {
u = v0; mindist = infinity;
for (v = 0; v < graph.GetVexNum(); v++)
if (graph.GetVisitedTag(v) == UNVISITED && dist[v] < mindist)
{
u = v; mindist = dist[v];
}
graph.SetVisitedTag(u, VISITED);
for (v = graph.GetFirstAdjvex(u); v != -1; v = graph.GetNextAdjvex(u, v))
if (graph.GetVisitedTag(v) == UNVISITED && mindist +
graph.GetWeight(u, v) < dist[v])
{
dist[v] = mindist + graph.GetWeight(u, v);
path[v] = u;
}
}
}
void OutputShortestPath(ALDirNetwork<char, int>& graph, int v, int* dist, int* path)
{
char vertex;
graph.GetElem(v, vertex);
for (int i = 0; i < graph.GetVexNum(); i++) {
if (i != v) {
char destVertex;
graph.GetElem(i, destVertex);
if (dist[i] == graph.GetInfinity()) {
std::cout << "There is no path between " << vertex << " and " << destVertex << "\n";
continue;
} //先判断有没有路径
cout << "The shortest path between " << vertex << " and " << destVertex << " is: \n";
// 输出路径
SqStack<int> stack;
int index = i;
while (path[index] != -1) {
stack.Push(index);
index = path[index];
}
std::cout << vertex;
while (!stack.IsEmpty()) {
char tmp;
int k;
stack.Pop(k);
cout << " " << graph.GetElem(k, tmp);
}
cout << endl;
std::cout << "The distance is: " << dist[i] << "\n";
}
}
}
请注意,这只是对您提供的代码进行的修复,并不能保证在其他环境中可以正常运行。
内容由零声教学AI助手提供,问题来源于学员提问