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() };
}
};

本文介绍了一种基于深度优先搜索(DFS)的后序遍历算法,用于解决从JFK机场出发的机票行程重构问题。通过使用优先级队列维护字典序,确保了输出行程的最小字典序。算法中特别注意了每条边的遍历,避免了重复路径,最终输出倒序的行程列表。
248

被折叠的 条评论
为什么被折叠?



