Reconstruct Itinerary

来源:互联网 发布:js select disabled 编辑:程序博客网 时间:2024/05/17 14:24

问题来源

问题描述

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:

  1. 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”].
  2. All airports are represented by three capital letters (IATA code).
  3. You may assume all tickets form at least one valid itinerary.

Example 1:

tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO","SJC"], ["LHR", "SFO"]]Return ["JFK", "MUC", "LHR", "SFO", "SJC"].

Example 2:

tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]Return ["JFK","ATL","JFK","SFO","ATL","SFO"].Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]. But it is larger in lexical order.

问题分析

显然,这是一道与有向图路径相关的题目。题目的大意是从给出的一堆有向边组合而成的图中找出一条从顶点JFK 到达其他顶点的字母序最小的路径。我们暂时不管字母序的问题,仅考虑如何选取一条路径。显然,DFS是一个较优的选择。以JFK为起点深度遍历整张图,注意到图中是有环的,所以我们还需做多的一步操作便是删除已遍历的边避免进入死循环。至于字母序的问题,我们只需要要每个结点的子结点按照字典序排好,遍历时从字典序最小的结点开始遍历即可。每次将当前结点的子结点遍历完成后再将当前结点压入路径数组中,最后将路径数组反转即可得到答案。

解决代码

class Solution {  public:    vector<string> findItinerary(vector<pair<string, string>> tickets) {        map<string, multiset<string>> edges;        for (auto loc : tickets) {          edges[loc.first].insert(loc.second);        }        vector<string> res;        if (tickets.size() == 0) return res;        dfs(res, "JFK", edges);        reverse(res.begin(), res.end());        return res;    }    void dfs(std::vector<string>& r, string loc, map<string, multiset<string>> & edges) {      while (edges[loc].size()) {        auto tmp = *(edges[loc].begin());        edges[loc].erase(edges[loc].begin());        dfs(r, tmp, edges);        }      r.push_back(loc);    }};
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 h5中的摇晃手机在电脑端怎么办 忘记手机锁屏密码怎么办4g qq最早绑定的号码忘记了怎么办 重启路由器之后宽带连接不上怎么办 微信授权小程序总是不行怎么办 微信把钱转到别人账户里了怎么办 微信转到对方账户停用了怎么办 微信号被认为是投票水军怎么办 微信投票时显示账号异常怎么办 京东商城买东西老不到货怎么办 优酷投屏一会就会出现花报怎么办 苹果手机的app安卓找不到怎么办 微信网页获取用户信息点了否怎么办 淘宝卖家退发货信息选择错了怎么办 法宣在线出现在其他地方登陆怎么办 QQ被冻结又不知道申诉资料怎么办 开通优酷会员了再开酷喵会员怎么办 考的不好时别人问你多少分时怎么办 订了产品一直收不到货怎么办 微信零钱提现忘记密码怎么办 微信里面的零钱忘记密码怎么办 微信的零钱密码丢了怎么办 微信公众号被屏蔽了所有功能怎么办 刚开淘宝店没信誉要怎么办 如果发现货品有问题商家不换怎么办 文件夹里面的图片怎么拖不动怎么办 网赌系统维护审核就不给提款怎么办 客户说我卖的东西是假货怎么办 微信小程序第三方平台倒闭了怎么办 金立手机锁屏密码忘了怎么办 不知道微信账号的公众号密码怎么办 微信公众号充话费充错号码怎么办 蜻蜓商城三天免流业务退不了怎么办 日上免税店提货日期写错了怎么办 微信公众平台账号名密码忘了怎么办 有人扬言要搞垮我的店铺怎么办 招行信用卡签到积分未领取怎么办 怎么办照片发送到邮微信箱里去 苹果手机备忘录没刪除就没了怎么办 因恶意刷公众号而被微信封号怎么办 禁停路段发生剐蹭怎么办办