В настоящее время пытаются реализовать алгоритм Дейкстры в C ++ с помощью списка смежности в текстовом файле, считываемом в объект карты. Карта инициализируется как:
map<int, vector<pair<int, int>>> = adjList;
Пример ввода текстового файла:
1 2,1 8,2
2 1,1 3,1
3 2,1 4,1
4 3,1 5,1
5 4,1 6,1
6 5,1 7,1
7 6,1 8,1
8 7,1 1,2
Где ключ является вершиной, а значения x пар в векторе связаны с ключевой вершиной. Значения y являются путевыми расстояниями. Я передаю эту карту в мою функцию dijkstra, где я инициализирую вектор для кратчайших расстояний и вектор для хранения посещенных вершин. Мой цикл - то, где вещи начинают идти не так, как я получаю выходные данные нулей и очень больших чисел. Вот мой код:
//checks if vertex has been visited or not
bool booler(int vertex, vector<int> visited){
bool booly;
if(find(visited.begin(), visited.end(), vertex) != visited.end()){
booly = true;
}
else{
booly = false;
}
return booly;
}
//checks vector for the shortest distance vertex
int minDist(vector<int> distances, vector<int> visited){
int minDist = 1000000;
int index;
for(int v = 0; v < distances.size(); v++){
if(booler(v, visited) == false && distances[v] < minDist){
minDist = distances[v];
index = v;
}
}
return index;
}
void dijkstra(int source, map<int, vector<pair<int, int>>> adjList, int vSize){
vector<int> distances(vSize, 1000000);
vector<int> visited = {};
distances[source] = 0;
for(int c = 0; c < distances.size(); c++){
int u = minDist(distances, visited);
visited.push_back(u);
for(int v = 1; v < distances.size(); v++){
for(int s = 0; s < adjList[u].size(); s++){
//updates distances based on v connection to u
if(booler(v, visited) == false && distances[u] < 1000000 && adjList[u][s].second + distances[u] < distances[v]){
distances[v] = distances[u] + adjList[u][v].second;
}
}
}
}
//prints out shortest path
for(int x = 0; x < distances.size(); x++){
cout << distances[x] << " " << endl;
}
}
Я не смог исправить эту ошибку, любая помощь будет принята с благодарностью!