332. Reconstruct Itinerary
Given a list of airline tickets represented by pairs of departure and arrival airports
[from, to]
, reconstruct the itinerary in order. All of the tickets belong to a man who departs fromJFK
. Thus, the itinerary must begin withJFK
.Note:
- If there are multiple valid itineraries, you should return the itinerary that has the smallest lexical order when read as a single string. For example, the itinerary
["JFK", "LGA"]
has a smaller lexical order than["JFK", "LGB"]
.- All airports are represented by three capital letters (IATA code).
- You may assume all tickets form at least one valid itinerary.
Example 1:
Input:
[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Output:["JFK", "MUC", "LHR", "SFO", "SJC"]
Example 2:
Input:
[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Output:["JFK","ATL","JFK","SFO","ATL","SFO"]
Explanation: Another possible reconstruction is["JFK","SFO","ATL","JFK","ATL","SFO"]
. But it is larger in lexical order.
使用后序遍历,最后倒序输出,每条边都要遍历一次,使用优先级队列来维持字典序,注意priority_queue默认为less-->大顶堆
所以我们需要定义成greater
不能用set,应为有可能有重复的两条路径!
class Solution {
public:
unordered_map<string,priority_queue<string,vector<string>,greater<string>>> m;
void dfs(string cur, vector<string>&res)
{
auto&s = m[cur];
while(!s.empty()){
string des = s.top();
s.pop();
dfs(des,res);
}
res.push_back(cur);
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
unordered_map<string, bool> visited;
for (int i = 0; i < tickets.size(); i++)
{
m[tickets[i][0]].push(tickets[i][1]);
}
string start = "JFK";
vector<string>res;
dfs(start,res);
return { res.rbegin(),res.rend() };
}
};