所以我一直在尝试实现Dijkstra算法来找到图中的最短路径,但是随着我的进展,我遇到了几个错误。首先,这是实际的问题和我给它的组件。
“编写一个c ++函数在图形上实现Dijkstra算法。图形实现在Moodle上,名为IntroToGraphs.zip。该函数有两个参数:起始顶点和目标顶点。打印最短路径和最短距离将顶点开始到目标顶点。“
void Graph :: Dijkstra(string starting,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;}
我正在使用此代码的错误是minDistance是最底部的未识别变量,当我设置tmp-&gt;距离它时。关于我需要解决的问题的任何线索?
答案 0 :(得分:3)
循环中声明的任何内容都限定在该循环中,并且不能在花括号外部访问。实际上,您甚至不需要循环来创建新范围。 More Info
在while循环中声明的变量minDistance。
答案 1 :(得分:1)
您需要在while循环范围之外初始化minDistance。
int minDistance=INT_MAX;
while(!ending->visited){
...
minDistance=someOtherValue
...
}
tmp->distance=minDistance;
可以在循环内部更改minDistance的值。
答案 2 :(得分:1)
解决也似乎永远不会被填充。你有:
vector<vertex *> solved;
...
for(int i=0;i<solved.size();i++){
vertex * s=solved[i];
这些都是我可以找到“已解决”并且没有任何值放入其中的情况所以for循环应该永远不会运行因为solve.size()总是等于0