2015-12-15 3 views
3

Я создал функцию, которая использует карты для алгоритма кратчайшего пути Дейкстры. Я близок к тому, что он работает правильно, но я сейчас застрял. Я знаю, что карты не являются наиболее эффективными и даже обычно не используются, и сделали это таким образом, чтобы лучше понять карты. Я считаю, что у меня в основном все правильно, но не может показаться, что оно повторяется и записывается в правильное местоположение в векторе расстояния. Это код:Алгоритм Dijsktra с использованием карт не правильно добавляет значения

void Graph::dikAlgorithm(string start, string finish) 
{ 
    nodeAmount = mapData.size(); 
    vector<double> costVec(nodeAmount); 
    vector<bool> vis(nodeAmount); 

    vector<map<string, double>> keys; 
    for (auto& kv : mapData) 
    { 
     keys.push_back(kv.second); 
    } 

    int staIndex = distance(mapData.begin(), mapData.find(start)); 
    int finIndex = distance(mapData.begin(), mapData.find(finish)); 

    //initialize the distance vector to infinity 
    for (int i = 0; i < nodeAmount; ++i) 
    { 
     costVec[i] = INFINITY; 
     vis[i] = false; 
    } 

    //starting city distance is set to zero 
    costVec[staIndex] = 0; 

    for (int i = 0; i < nodeAmount; ++i) 
    { 
     int cur = -1; 
     for (int j = 0; j < nodeAmount; ++j) 
     { 
      //if visited node has been visted, continue incrementing j 
      if (vis[j]) continue; 

      //once an unvisted node has been reached, check to see if next is less than current 
      if (cur == -1 || costVec[j] < costVec[cur]) 
      { 
       cur = j; 
      } 
     } 

     //set the visited node to solved 
     vis[cur] = true; 

     map<string, double>::iterator tempMap = keys[cur].begin(); 

     //add the total distance using maps and vectors 
     for (int j = 0; j < keys[cur].size() - 1; j++) 
     { 
      double tempCost = tempMap->second; 
      double pathCost = costVec[cur] + tempCost; 
      if (pathCost < costVec[j]) 
      { 
       costVec[distance(mapData.begin(), mapData.find(tempMap->first))] = pathCost; 
      } 
      tempMap++; 
     } 
    } 
    double answer = costVec[finIndex]; 
    cout << "The least amount of money from " << start << " to " << finish << " is " << answer << endl; 
} 

Я считаю, что ошибка происходя после этой строки

 map<string, double>::iterator tempMap = keys[cur].begin(); 

Эта ошибка является сохранение вектора расстояния от должным образом добавлены. Из-за этого я обычно получаю случайное значение из карты, являющейся кратчайшим путем или даже бесконечностью. Любая помощь будет принята с благодарностью. Не стесняйтесь спрашивать меня, нужны ли вам какие-либо подробности.

ответ

2

использование

map<string, double>::iterator tempMap; 
tempMap = keys.begin(); 

вместо

map<string, double>::iterator tempMap = keys[cur].begin(); 
+0

Он бросил ошибку говоря, не было никакого оператора, который соответствует этим операнды. Вы хотите, чтобы вы перебирали новый ключ с каждым прохождением цикла? – Giovanni

Смежные вопросы