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

修正后的代码如下所示:

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助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?