class Solution {
private:
// unordered_map<出发城市, map<到达城市, 航班次数>> targets
//其中航班次数是用来判断这个机场是否使用过,用来避免循环
unordered_map<string, map<string, int>> targets;
// 用bool类型是因为答案只需要一个结果
bool backTracking(int ticketNum, vector<string>& res) {
// ticketNum是用来进行终止的
if (res.size() == ticketNum + 1) {
return true;
}
//核心for循环
// 将上一层的到达城市,作为这一次的出发城市,利用pair来记录出发城市所能到达的城市
for (pair<const string, int>& target : targets[res[res.size() - 1]]) {
// 大于0说明没来过这个机场
if (target.second > 0) {
res.push_back(target.first);
target.second--;
if (backTracking(ticketNum, res)) return true;
res.pop_back();
target.second++;
}
}
return false;
}
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
vector<string> res;
// 初始化targets
for (const vector<string>& vec : tickets) {
targets[vec[0]][vec[1]]++;
}
// 初始化res
res.push_back("JFK");
backTracking(tickets.size(), res);
return res;
}
};