• 72重新安排行程(332)


    作者: Turbo时间限制: 1S章节: 深度优先搜索

    晚于: 2020-08-26 12:00:00后提交分数乘系数50%

    截止日期: 2020-09-02 12:00:00

    问题描述 :

    给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。

    说明:

    如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前

    所有的机场都用三个大写字母表示(机场代码)。

    假定所有机票至少存在一种合理的行程。

    示例 1:

    输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]

    输出: ["JFK", "MUC", "LHR", "SFO", "SJC"]

    示例 2:

    输入: [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]

    输出: ["JFK","ATL","JFK","SFO","ATL","SFO"]

    解释: 另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"]。但是它自然排序更大更靠后。

    可使用以下main函数:

    int main()

    {

        vector<vector<string>> tickets;

        int m;

        cin>>m;

        string a1,a2;

        for(int i=0; i<m; i++)

        {

            vector<string> aTicket;

            cin>>a1>>a2;

            aTicket.push_back(a1);

            aTicket.push_back(a2);

            tickets.push_back(aTicket);

        }

        vector<string> res=Solution().findItinerary(tickets);

        for(int i=0; i<res.size(); i++)

        {

            if (i>0)

                cout<<" ";

            cout<<res[i];

        }

        return 0;

    }

    输入说明 :

    首先输入机票张数m,

    然后输入m行,每行两个字符串,表示机场的代码,中间以空格分隔。

    输出说明 :

    输出结果

    输入范例 :

    输出范例 :

    #include <iostream> 
    #include <vector>
    #include <string>
    #include <unordered_map>
    #include <queue>
    #include <algorithm>
    using namespace std;
    
    class Solution
    {
        
    public:
        vector<string> res;
        vector<string> findItinerary(vector<vector<string>>& tickets)
        {
            unordered_map<string,priority_queue<string,vector<string>,greater<string>>> map;//greater指从小到大 
            for(auto &temp:tickets)
            {
                map[temp[0]].push(temp[1]);
            }
            dfs(map,"JFK");
            reverse(res.begin(),res.end());
            return res;
        }
        void dfs(unordered_map<string, priority_queue<string, vector<string>,greater<string>>>& map, string str)
        {
            while(map.find(str)!=map.end()&&map[str].size()>0)
            {
                string s_temp=map[str].top();
                map[str].pop();
                dfs(map,s_temp);
            }
            res.push_back(str);
        }
    };
    
    int main()
    {
        vector<vector<string>> tickets;
        int m;
        cin>>m;
        string a1,a2;
        for(int i=0; i<m; i++)
        {
            vector<string> aTicket;
            cin>>a1>>a2;
            aTicket.push_back(a1);
            aTicket.push_back(a2);
            tickets.push_back(aTicket);
        }
    
        vector<string> res=Solution().findItinerary(tickets);
        for(int i=0; i<res.size(); i++)
        {
            if (i>0)
                cout<<" ";
            cout<<res[i];
        }
    
        return 0;
    }
  • 相关阅读:
    艾伟:WinForm控件开发总结(三)认识WinForm控件常用的Attribute 狼人:
    break while(1)
    从“不太差”到“卓越”
    分享一种需求评审的方案
    高德地图 android api 实现自动定位
    Java Class Loader解析
    JAVA IO 设计模式彻底分析
    [latex]PGF 和 tikz中如何旋转图形的示例
    算法笔记之 并查集入门 POJ 1611
    Vector 和 ArrayList 哪一个更好? 为什么?
  • 原文地址:https://www.cnblogs.com/zmmm/p/13648204.html
Copyright © 2020-2023  润新知