#include <bits/stdc++.h>
using namespace std;
class Solution {
private:
unordered_map<string, vector<string>> graph;
// city -> longest path length starting from city
unordered_map<string, int> dp;
// city -> next city in longest path
unordered_map<string, string> nextCity;
int dfs(string city) {
if (dp.count(city))
return dp[city];
int maxLen = 1; // city itself
for (auto &nbr : graph[city]) {
int currLen = 1 + dfs(nbr);
if (currLen > maxLen) {
maxLen = currLen;
nextCity[city] = nbr;
}
}
return dp[city] = maxLen;
}
public:
vector<string> longestItinerary(
vector<pair<string, string>>& routes) {
unordered_set<string> allCities;
for (auto &route : routes) {
string from = route.first;
string to = route.second;
graph[from].push_back(to);
allCities.insert(from);
allCities.insert(to);
}
string startCity;
int longestLength = 0;
for (auto &city : allCities) {
int len = dfs(city);
if (len > longestLength) {
longestLength = len;
startCity = city;
}
}
vector<string> path;
while (!startCity.empty()) {
path.push_back(startCity);
if (!nextCity.count(startCity))
break;
startCity = nextCity[startCity];
}
return path;
}
};
int main() {
vector<pair<string, string>> routes = {
{"Chennai", "Hyderabad"},
{"Hyderabad", "Bangalore"},
{"Bangalore", "Delhi"},
{"Hyderabad", "Delhi"}
};
Solution obj;
vector<string> ans = obj.longestItinerary(routes);
for (int i = 0; i < ans.size(); i++) {
cout << ans[i];
if (i != ans.size() - 1)
cout << " -> ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTb2x1dGlvbiB7CnByaXZhdGU6CiAgICB1bm9yZGVyZWRfbWFwPHN0cmluZywgdmVjdG9yPHN0cmluZz4+IGdyYXBoOwoKICAgIC8vIGNpdHkgLT4gbG9uZ2VzdCBwYXRoIGxlbmd0aCBzdGFydGluZyBmcm9tIGNpdHkKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ+IGRwOwoKICAgIC8vIGNpdHkgLT4gbmV4dCBjaXR5IGluIGxvbmdlc3QgcGF0aAogICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsIHN0cmluZz4gbmV4dENpdHk7CgogICAgaW50IGRmcyhzdHJpbmcgY2l0eSkgewogICAgICAgIGlmIChkcC5jb3VudChjaXR5KSkKICAgICAgICAgICAgcmV0dXJuIGRwW2NpdHldOwoKICAgICAgICBpbnQgbWF4TGVuID0gMTsgLy8gY2l0eSBpdHNlbGYKCiAgICAgICAgZm9yIChhdXRvICZuYnIgOiBncmFwaFtjaXR5XSkgewogICAgICAgICAgICBpbnQgY3VyckxlbiA9IDEgKyBkZnMobmJyKTsKCiAgICAgICAgICAgIGlmIChjdXJyTGVuID4gbWF4TGVuKSB7CiAgICAgICAgICAgICAgICBtYXhMZW4gPSBjdXJyTGVuOwogICAgICAgICAgICAgICAgbmV4dENpdHlbY2l0eV0gPSBuYnI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBkcFtjaXR5XSA9IG1heExlbjsKICAgIH0KCnB1YmxpYzoKICAgIHZlY3RvcjxzdHJpbmc+IGxvbmdlc3RJdGluZXJhcnkoCiAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiYgcm91dGVzKSB7CgogICAgICAgIHVub3JkZXJlZF9zZXQ8c3RyaW5nPiBhbGxDaXRpZXM7CgogICAgICAgIGZvciAoYXV0byAmcm91dGUgOiByb3V0ZXMpIHsKICAgICAgICAgICAgc3RyaW5nIGZyb20gPSByb3V0ZS5maXJzdDsKICAgICAgICAgICAgc3RyaW5nIHRvID0gcm91dGUuc2Vjb25kOwoKICAgICAgICAgICAgZ3JhcGhbZnJvbV0ucHVzaF9iYWNrKHRvKTsKCiAgICAgICAgICAgIGFsbENpdGllcy5pbnNlcnQoZnJvbSk7CiAgICAgICAgICAgIGFsbENpdGllcy5pbnNlcnQodG8pOwogICAgICAgIH0KCiAgICAgICAgc3RyaW5nIHN0YXJ0Q2l0eTsKICAgICAgICBpbnQgbG9uZ2VzdExlbmd0aCA9IDA7CgogICAgICAgIGZvciAoYXV0byAmY2l0eSA6IGFsbENpdGllcykgewogICAgICAgICAgICBpbnQgbGVuID0gZGZzKGNpdHkpOwoKICAgICAgICAgICAgaWYgKGxlbiA+IGxvbmdlc3RMZW5ndGgpIHsKICAgICAgICAgICAgICAgIGxvbmdlc3RMZW5ndGggPSBsZW47CiAgICAgICAgICAgICAgICBzdGFydENpdHkgPSBjaXR5OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2ZWN0b3I8c3RyaW5nPiBwYXRoOwoKICAgICAgICB3aGlsZSAoIXN0YXJ0Q2l0eS5lbXB0eSgpKSB7CiAgICAgICAgICAgIHBhdGgucHVzaF9iYWNrKHN0YXJ0Q2l0eSk7CgogICAgICAgICAgICBpZiAoIW5leHRDaXR5LmNvdW50KHN0YXJ0Q2l0eSkpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIHN0YXJ0Q2l0eSA9IG5leHRDaXR5W3N0YXJ0Q2l0eV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGF0aDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiByb3V0ZXMgPSB7CiAgICAgICAgeyJDaGVubmFpIiwgIkh5ZGVyYWJhZCJ9LAogICAgICAgIHsiSHlkZXJhYmFkIiwgIkJhbmdhbG9yZSJ9LAogICAgICAgIHsiQmFuZ2Fsb3JlIiwgIkRlbGhpIn0sCiAgICAgICAgeyJIeWRlcmFiYWQiLCAiRGVsaGkifQogICAgfTsKCiAgICBTb2x1dGlvbiBvYmo7CgogICAgdmVjdG9yPHN0cmluZz4gYW5zID0gb2JqLmxvbmdlc3RJdGluZXJhcnkocm91dGVzKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFucy5zaXplKCk7IGkrKykgewogICAgICAgIGNvdXQgPDwgYW5zW2ldOwoKICAgICAgICBpZiAoaSAhPSBhbnMuc2l6ZSgpIC0gMSkKICAgICAgICAgICAgY291dCA8PCAiIC0+ICI7CiAgICB9CgogICAgY291dCA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9