Так что это мой текущий код, я буду публиковать декларации заголовка ниже ...Использование алгоритма Дейкстры с unordered_map графа
// Using Dijkstra's
int Graph::closeness(string v1, string v2){
int edgesTaken = 0;
unordered_map<string, bool> visited;
unordered_map<string, int> distances;
string source = v1; // Starting node
while(source != v2 && !visited[source]){
// The node has been visited
visited[source] = 1;
// Set all initial distances to infinity
for(auto i = vertices.begin(); i != vertices.end(); i++){
distances[i->first] = INT_MAX;
}
// Consider all neighbors and calculate distances from the current node
// & store them in the distances map
for(int i = 0; i < vertices[source].edges.size(); i++){
string neighbor = vertices[source].edges[i].name;
distances[neighbor] = vertices[source].edges[i].weight;
}
// Find the neighbor with the least distance
int minDistance = INT_MAX;
string nodeWithMin;
for(auto i = distances.begin(); i != distances.end(); i++){
int currDistance = i->second;
if(currDistance < minDistance){
minDistance = currDistance;
nodeWithMin = i->first;
}
}
// There are no neighbors and the node hasn't been found yet
// then terminate the function and return -1. The nodes aren't connected
if(minDistance == INT_MAX)
return -1;
// Set source to the neighbor that has the shortest distance
source = nodeWithMin;
// Increment edgesTaken
edgesTaken++;
// clear the distances map to prepare for the next iteration
distances.clear();
}
return edgesTaken;
}
Объявления (Это неориентированный граф):
class Graph{
private:
// This holds the connected name and the corresponding we
struct EdgeInfo{
std::string name;
int weight;
EdgeInfo() { }
EdgeInfo(std::string n, int w) : name(n), weight(
};
// This will hold the data members of the vertices, inclu
struct VertexInfo{
float value;
std::vector<EdgeInfo> edges;
VertexInfo() { }
VertexInfo(float v) : value(v) { }
};
// A map is used so that the name is used as the index
std::unordered_map<std::string, VertexInfo> vertices;
ПРИМЕЧАНИЕ. Пожалуйста, не предлагайте мне изменять декларации заголовков, я вношу свой вклад в проект, у которого уже было написано 8 других функций, и определенно слишком поздно возвращаться и изменять что-либо, так как после этого каждая другая функция должна быть перезаписана
В настоящее время я получаю неправильный вывод. Функция правильно обрабатывает ситуацию с расстоянием 0 (если две вершины не связаны, функция должна возвращать -1). Если два узла та же вершина ех близость («Бостон», «Бостон»), то функция должна возвращать 0.
Пример графика
близость следующих двух вершин на слева будет справа:
Correct:
Trenton -> Philadelphia: 2
Binghamton -> San Francisco: -1
Boston -> Boston: 0
Palo Alto -> Boston: -1
Output of my function:
Trenton -> Philadelphia: 3
Binghamton -> San Francisco: -1
Boston -> Boston: 0
Palo Alto -> Boston: 3
Я попытался скопировать Дейкстры точно, как это описано, но я получаю неправильные показания, я пытался выяснить это на некоторое время теперь -> Может кто-то указать мне верное направление?
Для меня Трентон -> Филадельфия - это действительно 3 края, потому что 3 + 2 + 10 <3 + 18. – Johan
Существует ряд проблем. Во-первых, ваш алгоритм на самом деле не отслеживает все доступные узлы, поэтому он просто перемещается по кратчайшему пути от любого заданного узла без учета общей длины пути.Во-вторых, возврат возвращает общее расстояние, но ваши «правильные» результаты выше - общее количество вершин в пути. Какой ты хочешь? –
Я редактировал свой код. Алгоритм должен выводить минимальные # ребра, полученные для получения от вершины v1 до вершины v2. Как вы можете видеть на графике @Johan, нужно всего 2 прыжка, необходимых для получения от Trenton -> Philidelphia – Riptyde4