2016-04-08 15 views
2

私はDijkstraアルゴリズムを実装してグラフ内で最短経路を見つけようとしていますが、私が進むにつれていくつかのエラーが発生しています。最初に、ここに実際の質問とそれが与えられたコンポーネントがあります。最短経路を見つけるためのダイクストラのアルゴリズム?

"Dijkstraのアルゴリズムをグラフ上に実装するためのC++関数を書くグラフの実装はIntroToGraphs.zipと呼ばれるMoodle上で行われます。関数は2つのパラメータをとります:頂点と終点の開始点最短経路と最短距離開始頂点からデスティネーション頂点までの距離。

void Graph :: Dijkstra(文字列の開始、文字列の宛先);

頂点構造が「visited」、「distance」、「previous」を含むように変更されました。ここで

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

はグラフクラスの定義です:

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です:

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; 

}; 

ここで私が書いたコードです私はそれにtmp-> distanceを設定すると、一番下の未確認の変数です。私が修正する必要があることについての手がかりは?

答えて

3

ループ内で宣言されたものはすべてそのループにスコープされ、中括弧の外側からはアクセスできません。実際には、新しいスコープを作成するためのループは必要ありません。 More Info

変数minDistance inがwhileループ内で宣言されています。

1

whileループのスコープ外でminDistanceを初期化する必要があります。

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

ループ内でminDistanceの値を変更することができます。

1

も解決されません。あなたは持っている:

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

ものを私は「解決」見つけることができるとは値が今までsolved.size()は常に0

に等しいので、forループを実行することはありませんので、それに置かれていないすべてのケースがあります
関連する問題