#include <bits/stdc++.h>
using namespace std;
pair<int, vector<string>> dijikstra(unordered_map<string, vector<pair<string, int>>> graph, string src, string dest) {
// Priority queue to hold nodes to be explored with the current shortest time to reach them
priority_queue<pair<int, vector<string>>, vector<pair<int, vector<string>>>, greater<>> pq; // Min heap to sort in asc order
pq.push({0, {src}});
unordered_map<string, int> best_time;
best_time[src] = 0;
while (!pq.empty()) {
pair<int, vector<string>> current = pq.top();
pq.pop();
int current_time = current.first;
vector<string> path = current.second;
string current_node = path.back();
// If we reach the destination, return the time and path
if (current_node == dest) {
return {current_time, path};
}
// If we have already found a better path, continue
if (current_time > best_time[current_node]) {
continue;
}
// Explore neighbors
for (int i = 0; i < graph[current_node].size(); i++) {
pair<string, int> neighbor = graph[current_node][i];
int new_time = current_time + neighbor.second;
if (best_time.find(neighbor.first) == best_time.end() || new_time < best_time[neighbor.first]) {
best_time[neighbor.first] = new_time;
vector<string> new_path = path;
new_path.push_back(neighbor.first);
pq.push({new_time, new_path});
}
}
}
// If no path is found
return {-1, {}};
}
int main() {
// adjacency list
unordered_map<string, vector<pair<string, int>>> graph ;
graph["A"].push_back(make_pair("B", 1));
graph["A"].push_back(make_pair("C", 8));
graph["B"].push_back(make_pair("C", 6));
graph["B"].push_back(make_pair("D", 5));
graph["C"].push_back(make_pair("D", 1));
graph["C"].push_back(make_pair("E", 2));
graph["D"].push_back(make_pair("E", 4));
/* Other way to initialise
unordered_map<string, vector<pair<string, int>>> graph = {
{"A", {{"B", 1}, {"C", 8}}},
{"B", {{"C", 6}, {"D", 5}}},
{"C", {{"D", 1}, {"E", 2}}},
{"D", {{"E", 4}}}
};
*/
string source = "A";
string destination = "E";
pair<int, vector<string>> result = dijikstra(graph, source, destination);
cout << "Shortest time is " << result.first <<endl;
for (int i = 0; i < result.second.size(); i++) {
cout << result.second[i] << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKcGFpcjxpbnQsIHZlY3RvcjxzdHJpbmc+PiBkaWppa3N0cmEodW5vcmRlcmVkX21hcDxzdHJpbmcsIHZlY3RvcjxwYWlyPHN0cmluZywgaW50Pj4+IGdyYXBoLCAgc3RyaW5nIHNyYywgIHN0cmluZyBkZXN0KSB7CiAgICAvLyBQcmlvcml0eSBxdWV1ZSB0byBob2xkIG5vZGVzIHRvIGJlIGV4cGxvcmVkIHdpdGggdGhlIGN1cnJlbnQgc2hvcnRlc3QgdGltZSB0byByZWFjaCB0aGVtCiAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGludCwgdmVjdG9yPHN0cmluZz4+LCB2ZWN0b3I8cGFpcjxpbnQsIHZlY3RvcjxzdHJpbmc+Pj4sIGdyZWF0ZXI8Pj4gcHE7IC8vIE1pbiBoZWFwIHRvIHNvcnQgaW4gYXNjIG9yZGVyCiAgICBwcS5wdXNoKHswLCB7c3JjfX0pOwoKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ+IGJlc3RfdGltZTsKICAgIGJlc3RfdGltZVtzcmNdID0gMDsKCiAgICB3aGlsZSAoIXBxLmVtcHR5KCkpIHsKICAgICAgICBwYWlyPGludCwgdmVjdG9yPHN0cmluZz4+IGN1cnJlbnQgPSBwcS50b3AoKTsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpbnQgY3VycmVudF90aW1lID0gY3VycmVudC5maXJzdDsgCiAgICAgICAgdmVjdG9yPHN0cmluZz4gcGF0aCA9IGN1cnJlbnQuc2Vjb25kOwogICAgICAgIHN0cmluZyBjdXJyZW50X25vZGUgPSBwYXRoLmJhY2soKTsKCiAgICAgICAgLy8gSWYgd2UgcmVhY2ggdGhlIGRlc3RpbmF0aW9uLCByZXR1cm4gdGhlIHRpbWUgYW5kIHBhdGgKICAgICAgICBpZiAoY3VycmVudF9ub2RlID09IGRlc3QpIHsKICAgICAgICAgICAgcmV0dXJuIHtjdXJyZW50X3RpbWUsIHBhdGh9OwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGZvdW5kIGEgYmV0dGVyIHBhdGgsIGNvbnRpbnVlCiAgICAgICAgaWYgKGN1cnJlbnRfdGltZSA+IGJlc3RfdGltZVtjdXJyZW50X25vZGVdKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gRXhwbG9yZSBuZWlnaGJvcnMKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyYXBoW2N1cnJlbnRfbm9kZV0uc2l6ZSgpOyBpKyspIHsKCiAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBpbnQ+IG5laWdoYm9yID0gZ3JhcGhbY3VycmVudF9ub2RlXVtpXTsKICAgICAgICAgICAgaW50IG5ld190aW1lID0gY3VycmVudF90aW1lICsgbmVpZ2hib3Iuc2Vjb25kOwoKICAgICAgICAgICAgaWYgKGJlc3RfdGltZS5maW5kKG5laWdoYm9yLmZpcnN0KSA9PSBiZXN0X3RpbWUuZW5kKCkgfHwgbmV3X3RpbWUgPCBiZXN0X3RpbWVbbmVpZ2hib3IuZmlyc3RdKSB7CiAgICAgICAgICAgICAgICBiZXN0X3RpbWVbbmVpZ2hib3IuZmlyc3RdID0gbmV3X3RpbWU7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+IG5ld19wYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgIG5ld19wYXRoLnB1c2hfYmFjayhuZWlnaGJvci5maXJzdCk7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtuZXdfdGltZSwgbmV3X3BhdGh9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiBubyBwYXRoIGlzIGZvdW5kCiAgICByZXR1cm4gey0xLCB7fX07Cn0KCmludCBtYWluKCkgewogICAgLy8gYWRqYWNlbmN5IGxpc3QKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4+PiBncmFwaCA7CiAgICBncmFwaFsiQSJdLnB1c2hfYmFjayhtYWtlX3BhaXIoIkIiLCAxKSk7CiAgICBncmFwaFsiQSJdLnB1c2hfYmFjayhtYWtlX3BhaXIoIkMiLCA4KSk7CgogICAgZ3JhcGhbIkIiXS5wdXNoX2JhY2sobWFrZV9wYWlyKCJDIiwgNikpOwogICAgZ3JhcGhbIkIiXS5wdXNoX2JhY2sobWFrZV9wYWlyKCJEIiwgNSkpOwoKICAgIGdyYXBoWyJDIl0ucHVzaF9iYWNrKG1ha2VfcGFpcigiRCIsIDEpKTsKICAgIGdyYXBoWyJDIl0ucHVzaF9iYWNrKG1ha2VfcGFpcigiRSIsIDIpKTsKCiAgICBncmFwaFsiRCJdLnB1c2hfYmFjayhtYWtlX3BhaXIoIkUiLCA0KSk7CgoKICAgIC8qICAgICAgT3RoZXIgd2F5IHRvIGluaXRpYWxpc2UKICAgICAgICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsIHZlY3RvcjxwYWlyPHN0cmluZywgaW50Pj4+IGdyYXBoID0gewogICAgICAgICAgICAgICAgeyJBIiwge3siQiIsIDF9LCB7IkMiLCA4fX19LAogICAgICAgICAgICAgICAgeyJCIiwgIHt7IkMiLCA2fSwgeyJEIiwgNX19fSwKICAgICAgICAgICAgICAgIHsiQyIsIHt7IkQiLCAxfSwgeyJFIiwgMn19fSwKICAgICAgICAgICAgICAgIHsiRCIsIHt7IkUiLCA0fX19CiAgICAgICAgfTsKCiAgICAqLwoKICAgIHN0cmluZyBzb3VyY2UgPSAiQSI7CiAgICBzdHJpbmcgZGVzdGluYXRpb24gPSAiRSI7CiAgICBwYWlyPGludCwgdmVjdG9yPHN0cmluZz4+IHJlc3VsdCA9IGRpamlrc3RyYShncmFwaCwgc291cmNlLCBkZXN0aW5hdGlvbik7CgoKICAgIGNvdXQgPDwgIlNob3J0ZXN0IHRpbWUgaXMgIiA8PCByZXN1bHQuZmlyc3QgPDxlbmRsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2Vjb25kLnNpemUoKTsgaSsrKSB7CiAgICAgICAgY291dCA8PCByZXN1bHQuc2Vjb25kW2ldIDw8ICIgIjsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=