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=出度)外,其餘點的 入度==出度

在這裏插入圖片描述

  • 以下代碼的思路如上圖
  • 按照題意,對起點連接的點存在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章