【问题标题】:Dijkstra's algorithm for finding the shortest path?寻找最短路径的 Dijkstra 算法?
【发布时间】:2016-07-30 08:03:10
【问题描述】:

所以我一直在尝试实施 Dijkstra 算法来找到图中的最短路径,但在进行过程中遇到了几个错误。首先,这是我收到的实际问题和组件。

"写一个c++函数,在一个图上实现Dijkstra算法。图实现在Moodle上,叫做IntroToGraphs.zip。该函数有两个参数:起始顶点和目的顶点。打印最短路径和到图的最短距离起始顶点到目标顶点。”

void Graph::Dijkstra(string start, string destination);

顶点结构已更改为包括“已访问”、“距离”和“先前”。

struct adjVertex{
    vertex *v;
    int weight;
};
struct vertex{
    std::string name;
    bool visited;
    int distance;
    vertex *previous;
    std::vector<adjVertex> adj;
};

这里是Graph类的定义:

class Graph
{
    public:
        Graph();
        ~Graph();
        void addEdge(std::string v1, std::string v2, int weight);
        void addVertex(std::string name);
        void displayEdges();
    void Dijkstra(string sourceVertex, string destinationVertex);
    protected:
    private:
        std::vector<vertex> vertices;

};

这是我写的代码:

void Graph::Dijkstra(string starting, string destination){
vertex * start;
vertex * ending;
for(int i=0;i<vertices.size();i++){
    vertices[i].visited=false;
    vertices[i].distance=INT_MAX;
    vertices[i].previous=NULL;
    if(vertices[i].name==starting){
        start=&vertices[i];
    }
    if(vertices[i].name==destination){
        ending=&vertices[i];
    }
}
start->visited=true;
start->distance=0;
vector<vertex *> solved;
vector<vertex *> path;
vertex *tmp;
vertex *parent;
while(!ending->visited){ //pseudo territory
    int minDistance=INT_MAX;
    tmp=NULL;
    for(int i=0;i<solved.size();i++){
        vertex * s=solved[i];
        for(int y=0;y<s->adj.size();y++){
            if(!s->adj[y].v->visited){
                s->distance=s->distance+s->adj[y].v->distance;
                if(s->distance<minDistance){
                    tmp=s->adj[y].v;
                    minDistance=s->distance;
                    parent=s->previous;
                }
            }
        }
    }
}
tmp->distance=minDistance;
tmp->previous=parent;
tmp->visited=true;}

我在使用此代码时遇到的错误是,当我将 tmp->distance 设置为它时,minDistance 是最底部的一个未识别变量。关于我需要修复什么的任何线索?

【问题讨论】:

    标签: c++ algorithm dijkstra


    【解决方案1】:

    在循环中声明的任何内容都限定在该循环范围内,并且不能在花括号之外访问。事实上,您甚至不需要循环来创建新范围。 More Info

    在while循环中声明的变量minDistance。

    【讨论】:

      【解决方案2】:

      你需要在while循环范围之外初始化minDistance。

      int minDistance=INT_MAX;
      while(!ending->visited){ 
          ...
          minDistance=someOtherValue
          ...
      }
      tmp->distance=minDistance;
      

      minDistance 的值可以在循环内更改。

      【讨论】:

        【解决方案3】:

        solved 似乎也从未被填充。你有:

        vector<vertex *> solved;
        ...
            for(int i=0;i<solved.size();i++){
                vertex * s=solved[i];
        

        这些都是我可以找到“已解决”并且没有任何值放入其中的所有情况,因此 for 循环不应运行,因为solved.size() 始终等于0

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多