题目大意:给出一些旅行票的出发地和目的地对,求出一个行程规划,使得用完所有的票
分析:map和stack应用。用map存储出发地和目的地的匹配对,由于同一个起始地可能对应很多目的地,所以map的第二个设为multiset。用stack记录路径,将from压入栈中,找出它对应map中的目的地,如果非空则将目的地压入栈中,如果目的地为空则意味着到了一个终点,将from弹栈,放入结果点集中。由于首先查找到的是终点,所以最后要将ans反转。
代码:
class Solution {
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
vector<string> ans;
map<string,multiset<string>> dest; //题里要求按最小字典排序,所以用multiset(插入自动排序)
for(auto t : tickets){
dest[t[0]].insert(t[1]);
}
stack<string> path;
string from = "JFK";
path.push(from);
while(!path.empty()){
from = path.top();
if(!dest[from].empty()){ //还有票
path.push(*dest[from].begin()); //multiset.begin()返回的是第一个数据的地址,所以需要*号
dest[from].erase(dest[from].begin());
}
else{ //到终点了
ans.push_back(from);
path.pop();
}
}
reverse(ans.begin(),ans.end());
return ans;
}
};