C++ 迪克斯特拉’;带回溯顶点的s算法问题

C++ 迪克斯特拉’;带回溯顶点的s算法问题,c++,algorithm,dijkstra,backtracking,C++,Algorithm,Dijkstra,Backtracking,我正在尝试对访问的顶点进行回溯,以获得到顶点的成本最低的路径。我得到了不正确的结果,不明白为什么。唯一正确的输出是图像中的最后一个输出。是什么导致了错误的结果 注意:driverMap是一个2D 14x14整数向量,用于保存到达每个顶点所需的距离,path是一个int数组,用于保存过去的顶点路径。开头是一段代码,从我的主要功能中帮助我 这是不同的,因为我之前的问题是不同的,这一次我在尝试回溯时,就我当前的输出请求帮助,以达到预期的效果 for(int i = 0; i < allCars.

我正在尝试对访问的顶点进行回溯,以获得到顶点的成本最低的路径。我得到了不正确的结果,不明白为什么。唯一正确的输出是图像中的最后一个输出。是什么导致了错误的结果

注意:driverMap是一个2D 14x14整数向量,用于保存到达每个顶点所需的距离,path是一个int数组,用于保存过去的顶点路径。开头是一段代码,从我的主要功能中帮助我

这是不同的,因为我之前的问题是不同的,这一次我在尝试回溯时,就我当前的输出请求帮助,以达到预期的效果

for(int i = 0; i < allCars.size(); i++) //allCars.size()

{

    int startInt = allCars[i].getStart(), loopEnder = 0;



    for(int k = 0; k < driverMap.size(); k++)
    {
        path[k] = 0;
        Distances[k] = 0;
    }


    for(int j = 0; j < driverMap.size(); j++) 

    {

        Distances[j] = driverMap[startInt][j];

    }

    cout << "\nSTART INTERSECTION: '" << startInt << "' END INTERSECTION: '" << allCars[i].getEnd() << "'" <<  endl;


    Dijkstra(driverMap, Distances, path, startInt);

    int endInt = allCars[i].getEnd(), atInt = path[endInt];

    cout << "END = " << endInt;

    //allCars[i].addPath(endInt);
    do
    {
        cout << "AT = " << atInt;
        allCars[i].addPath(atInt);
        atInt = path[atInt];
        loopEnder++;
    }while(atInt != endInt && loopEnder < 5);
    cout << endl;

    //allCars[i].addPath(startInt);


    allCars[i].displayCar();

}

void Dijkstra(const vector< vector<int> > & driverMap, int Distances[], int path[], int startInt) 
{
    int Intersections[driverMap.size()];
    for(int a = 0; a < driverMap.size(); a++)
    {
        Intersections[a] = a;
    }
    Intersections[startInt] = -1;

    for(int l = 0; l < driverMap.size(); l++)
    {
        int minValue = 99999;

        int minNode = 0;




        for (int i = 0; i < driverMap.size(); i++) 

        {

            if(Intersections[i] == -1) 

            {

                continue;

            }

            if(Distances[i] > 0 && Distances[i] < minValue)

            {

                minValue = Distances[i];

                minNode = i;

            }

        }


        Intersections[minNode] = -1;





        for(int i = 0; i < driverMap.size(); i++) 

        {

            if(driverMap[minNode][i] < 0)

            {

                continue;

            }

            if(Distances[i] < 0) 

            {

                Distances[i] = minValue + driverMap[minNode][i];
                path[i] = minNode;

                continue;

            }

            if((Distances[minNode] + driverMap[minNode][i]) < Distances[i]) 

            {

                Distances[i] = minValue + driverMap[minNode][i];
                path[i] = minNode;

            }

        }
    }

}

for(int i=0;i在djikstra中cout如果您后退(芬兰语->开始),只需在每个步骤中选择最低成本的节点即可到达起始点。这在您解出图形并对每个节点进行评估/成本计算后生效。

在djikstra中进行回溯

  • 记录用较小值更新当前节点值的节点

    // Every time you update distance value with a smaller value
    Distances[i] = minValue + driverMap[minNode][i];
    back[i] = minNode;  //Record the node with an int array, should be something like this
    
  • 完成所有djikstra循环后。从起点以外的任何点回溯。 比如说,我们想在图中从pt 5追踪到pt 0,其中pt 5是起点。我们从0开始,取回[0](应该等于4),然后取回[4](应该等于8),然后取回[8](应该等于5),那么我们应该有一些机制停在这里,因为pt 5是一个起点。因此,你得到0-4-8-5,然后你颠倒顺序。你得到路径5-8-4-0

  • 在我的方法中,
    pathake[minNode]。push_back(i);
    未使用。对于连接到起始点的用户,您可能需要使用起始点的值启动int数组back[]


    编辑部分

    您没有抓住要点:“对于连接到起点的人,您可能需要使用起点的值启动int数组back[]

    路径[k]=0;
    错误。您不应该在所有情况下使用固定索引启动路径。相反,您应该使用startInt(对于直接连接到起始节点的节点)和不存在的节点索引-1(对于不直接连接到起始节点的节点)

    回溯跟踪所做的是什么

  • 记录哪个节点向当前节点提供了新的最小成本(并在dijkstra循环中不断更新)。最后,每个节点将获得一个节点值(
    back[i]
    ,在我的情况下),该值指向为节点i提供其最小成本的节点
  • 基于带回溯的dijkstra算法的概念,back[i]是从起始节点到节点i的路径中的前一个节点。这意味着路径应该如下所示:

    (start node)->(path with zero or more nodes)->node point by back[i]-> node i
    
  • 应用这个概念,我们可以用back[i]、back[back[i]]、back[back[i]]、


    <为什么> <代码>路径[k]=0,是错误的?在您的代码中,您的起始节点并不总是节点<代码> 0 ,而是Stuttt。考虑像“代码> StTiTrt=13 < /代码>之类的情况,并且您的目标目的节点是“代码> 11”/代码>。显然,路径是“代码> 13-11< /代码>。对于节点<代码> 11 < /代码>,它将永远不会遇到<代码>距离[i]。=minValue+driverMap[minNode][i];
    startint=13时,因为这是第一个最小成本节点。您设置了什么?节点
    11
    返回[11]=0
    (初始化)这表明路径节点
    13
    11
    中的前一个节点是节点
    0
    ,这在概念上显然是不正确的,并且back[0]=0(从13到0的最佳路径是
    13-0
    ,也没有更新),它将作为
    0=back[back[0]=back[back[0]]循环到自身=…

    问题是…?在计算到顶点的最小距离时,我需要存储访问的正确顶点。我尝试过,但现在不知道如何执行此操作。我不知道如何执行此操作。谢谢,它访问的第一个节点总是在索引处吗0@JacksonCollins不,第0点只是一个例子。第一点t to visit是您想要的终点。您可以从起点以外的任何终点回溯。例如,我想要从第5点到第8点的路径,我可以从第8点开始,然后返回[8]。不必总是从第0点开始。嘿,我有逻辑错误。输出不正确,我是否应该编辑帖子并显示我的问题?@JacksonCollins请在一篇帖子中提出一个特定问题,除非该问题与答案相关。@JacksonCollins在我的帖子中查看此问题。“您可能需要重新启动int数组[]对于连接到起始点的用户,使用起始点的值“
    path[k]=0;”
    是错误的。您不应该在所有情况下使用固定索引来启动路径。相反,您应该使用startInt(对于直接连接到起始节点的用户)和不存在的节点索引-1(对于未直接连接到起始节点的用户)来启动路径