1. 程式人生 > 實用技巧 >72重新安排行程(332)

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