ZBLOG

void Dijkstra(ALDirNetwork& 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[...

根据您提供的代码,有几个问题需要修复:

  1. 在函数 Dijkstra 中,第一个 for 循环应该从 0 开始遍历到 graph.GetVexNum() - 1,而不是 graph.GetVexNum()。因为顶点索引是从 0 开始的。

  2. 在第一个 for 循环内部的 if 语句中,设置了初始路径 path[v] = v0;。但在后续循环中,并没有更新这个初始值,导致最短路径可能无法正确计算。可以将这行代码移动到第一个 for 循环之前。

  3. 在函数 OutputShortestPath 中,使用了未定义的变量 endl,应该改为使用换行符 \n

修正后的代码如下所示:

  1. void Dijkstra(ALDirNetwork<char, int>& graph, int v0, int* dist, int* path)
  2. {
  3. int mindist, infinity = graph.GetInfinity();
  4. int v, u;
  5. for (v = 0; v < graph.GetVexNum(); v++) {
  6. dist[v] = graph.GetWeight(v0, v);
  7. if (dist[v] == infinity) path[v] = -1;
  8. else path[v] = v0;
  9. }
  10. graph.SetVisitedTag(v0, VISITED);
  11. for (int i = 1; i < graph.GetVexNum(); i++) {
  12. u = v0; mindist = infinity;
  13. for (v = 0; v < graph.GetVexNum(); v++)
  14. if (graph.GetVisitedTag(v) == UNVISITED && dist[v] < mindist)
  15. {
  16. u = v; mindist = dist[v];
  17. }
  18. graph.SetVisitedTag(u, VISITED);
  19. for (v = graph.GetFirstAdjvex(u); v != -1; v = graph.GetNextAdjvex(u, v))
  20. if (graph.GetVisitedTag(v) == UNVISITED && mindist +
  21. graph.GetWeight(u, v) < dist[v])
  22. {
  23. dist[v] = mindist + graph.GetWeight(u, v);
  24. path[v] = u;
  25. }
  26. }
  27. }
  28. void OutputShortestPath(ALDirNetwork<char, int>& graph, int v, int* dist, int* path)
  29. {
  30. char vertex;
  31. graph.GetElem(v, vertex);
  32. for (int i = 0; i < graph.GetVexNum(); i++) {
  33. if (i != v) {
  34. char destVertex;
  35. graph.GetElem(i, destVertex);
  36. if (dist[i] == graph.GetInfinity()) {
  37. std::cout << "There is no path between " << vertex << " and " << destVertex << "\n";
  38. continue;
  39. } //先判断有没有路径
  40. cout << "The shortest path between " << vertex << " and " << destVertex << " is: \n";
  41. // 输出路径
  42. SqStack<int> stack;
  43. int index = i;
  44. while (path[index] != -1) {
  45. stack.Push(index);
  46. index = path[index];
  47. }
  48. std::cout << vertex;
  49. while (!stack.IsEmpty()) {
  50. char tmp;
  51. int k;
  52. stack.Pop(k);
  53. cout << " " << graph.GetElem(k, tmp);
  54. }
  55. cout << endl;
  56. std::cout << "The distance is: " << dist[i] << "\n";
  57. }
  58. }
  59. }

请注意,这只是对您提供的代码进行的修复,并不能保证在其他环境中可以正常运行。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9391

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?