天天看點

LeetCode 332. 重新安排行程(歐拉路徑)

1. 題目

給定一個機票的字元串二維數組 [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"]。
但是它自然排序更大更靠後。           

複制

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/reconstruct-itinerary

著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

可以看看:

了解一下數學中的歐拉路徑,你就能成為一筆畫小遊戲的大神

歐拉路徑與歐拉回路

歐拉回路的充要條件

無向圖:所有點的度數都為偶數

有向圖:所有點的入度==出度

歐拉路徑的充要條件

無向圖:除兩點(起點與終點)外其餘點的度數都為偶數

有向圖:除兩點(起點 入度+1=出度,終點 入度−1=出度)外,其餘點的 入度==出度

LeetCode 332. 重新安排行程(歐拉路徑)
  • 以下代碼的思路如上圖
  • 按照題意,對起點連接配接的點存在

    multiset

    (有序)中,從begin開始
  • 不斷的遞歸,遞歸前,删除邊
  • 當邊的個數為0時,再把節點添加到答案中
  • 最後答案逆序就是歐拉路徑
class Solution {
	unordered_map<string, multiset<string>> m;
	vector<string> ans;
public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
    	for(auto& t : tickets)
    		m[t[0]].insert(t[1]);
    	dfs("JFK");
    	reverse(ans.begin(),ans.end());
    	return ans;
    }
    void dfs(string s)
    {
    	while(m[s].size() != 0)
    	{
    		string to = *m[s].begin();
    		m[s].erase(m[s].begin());
    		dfs(to);
    	}
        ans.push_back(s);
    }
};           

複制

52 ms 14 MB