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 from JFK
. Thus, the itinerary must begin with JFK
.
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.
这道题有几个点记录一下,这道题是欧拉回路的问题:
- 利用multiset自动按字典序排序的特点来实现贪心算法。
- 利用递归回路的时候遍历其他分路来进行merge。
- 算法的基本思路就是找到所有的路径然后对该结点进行路径merget。
代码和备注如下:
class Solution {
public:
//存储图结构
//采用multiset,可以自动进行升序的排序
map<string,multiset<string> > targets;
vector<string> route;
vector<string> findItinerary(vector<pair<string, string>> tickets) {
//把每一个ticket对放在targets中
//
for(auto ticket:tickets)
targets[ticket.first].insert(ticket.second);
visit("JFK");
//返回的要倒序,因为是倒着往前读的
return vector<string>(route.rbegin(),route.rend());
}
void visit(string airport)
{
//遍历从airport出发的所有城市
//这个while循环,相当于要把所有结点都经过才算完成
while(targets[airport].size()) {
string next=*targets[airport].begin();
//删除已经访问的结点
targets[airport].erase(targets[airport].begin());
visit(next);
}
route.push_back(airport);
}
};