1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include "graph.hpp" #include <algorithm>
Node *getMinDistanceAndUnselectedNode(unordered_map<Node *, int> &distanceMap, unordered_set<Node *> &selectedNodes) { Node *minNode = nullptr; int minDistance = INT32_MAX; for (auto &entry : distanceMap) { Node *node = entry.first; int distance = entry.second; if (selectedNodes.find(node) == selectedNodes.end() && distance < minDistance) { minNode = node; minDistance = distance; } } return minNode; }
unordered_map<Node *, int> dijkstra(Node *head) { if (head == nullptr) { return unordered_map<Node *, int>(); }
unordered_map<Node *, int> distanceMap; distanceMap.insert(make_pair(head, 0)); unordered_set<Node *> selectedNodes;
Node *minNode = head; while (minNode != nullptr) { int distance = distanceMap[minNode]; for (auto &edge : minNode->edges) { Node *toNode = edge->to; if (distanceMap.find(toNode) == distanceMap.end()) { distanceMap[toNode] = distance + edge->weight; } else { distanceMap[toNode] = min(distanceMap[toNode], distance + edge->weight); } } selectedNodes.insert(minNode); minNode = getMinDistanceAndUnselectedNode(distanceMap, selectedNodes); } return distanceMap; }
void test1() { vector<vector<int>> matrix = {{3, 1, 2}, {3, 2, 1}, {15, 1, 3}, {15, 3, 1}, {9, 1, 4}, {9, 4, 1}, {2, 2, 3}, {2, 3, 2}, {7, 3, 4}, {7, 4, 3}, {200, 2, 5}, {200, 5, 2}, {14, 3, 5}, {14, 5, 3}, {16, 4, 5}, {16, 5, 4}}; shared_ptr<Graph> graph = creatGraph(matrix);
unordered_map<Node *, int> res = dijkstra(graph.get()->nodes[1].get()); for (auto it : res) { cout << it.first->value << " " << it.second << endl; } }
int main() { test1();
return 0; }
|