Hierholzer演算法 重新安排行程

2021-10-03 17:59:16 字數 1964 閱讀 4396

尤拉跡是指一條包含圖中所有邊的一條路徑,該路徑中所有的邊會且僅會出現一次。

乙個無向圖中包含尤拉跡,當且僅當下面兩條性質同時滿足:

而乙個有向圖包含尤拉跡,當且僅當下面兩條性質同時滿足:

hierholzer演算法用於在連通圖尋找尤拉跡,其流程非常簡單。

從乙個可能的起點出發,進行深度優先搜尋,但是每次沿著輔助邊從某個頂點移動到另外乙個頂點的時候,都需要刪除這個輔助邊。如果沒有可移動的路徑,則將所在結點加入到棧中,並返回。

void dfs(node node, deque trace)

trace.addlast(node);

}

最後得到的棧中儲存的就是整個尤拉跡中的頂點。

這個演算法應用起來非常簡單,下面我們先證明幾條性質。

性質1. 如果圖中包含閉尤拉跡,則棧的底部儲存的必定是起點。如果圖中包含的是開尤拉軌跡,則棧底部儲存的是與起點不同的另外乙個奇度數端點。

證明:當我們要入棧時,說明當前所在頂點沒有任何邊了。考慮到從起點出發到當前結點的路徑中,除了起點和當前頂點外,所有的頂點都失去了偶數度數(在移除了途經的邊後)。如果起點和當前頂點不同,那麼兩者都失去了奇數度數。如果圖中包含閉尤拉跡,這意味著所有頂點的初始度數都是偶數,而當前頂點的剩餘度數為0,表示當前頂點的初始度數必定是奇數,當然這是不可能的,因此假設不成立,當前頂點就是起點。同樣的對於開尤拉跡,當前頂點不可能是起點,否則起點的度數就是偶數,而開尤拉跡中起點和終點的度數一定是奇數。這樣就能推出當前頂點既不是起點度數也是偶數,因此一定是終點。

性質2.如果圖中包含閉尤拉跡,入棧的倒數第二個頂點一定是路徑中的第二個頂點。

證明:由於路徑中的第二個頂點入棧,說明起點已經入棧過,換言之,起點已經沒有多餘的邊了。

參考原文:

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

套用尤拉跡的公式,可以這樣理解:

重新安裝GCC, G

直接解除安裝 sudo apt get remove gcc sudo apt get remove g 若解除安裝不順利還可以用sudo apt get autoremove 再重新安裝gcc 利用 sudo aptitude search gcc grep gcc sudo aptitude s...

重新安裝ubuntu unity

因為折騰輸入法,解除安裝了ibus,解除安裝時沒仔細看,解除安裝了所有的ibus和關聯包,導致ubuntu登入後桌面一片空白,什麼都沒有。左側啟動器沒有,上方工作列也沒有,就是桌面登入後假死狀態。在網上查詢了很多資料,都無法修復,最終只能重新安裝ubuntu unity了。下面是安裝過程。ctrl ...

重新安裝電腦

這次相比幾個星期以前的重灌不同在於確定了基本上不使用windows,所以把主要精力放在linux ubuntu 的安裝上。和原先一樣,安裝nvidia顯示卡驅動,安裝jdk,groovy,grails等等,然後開發工具netbeans,還有qt creator。因為這些東西以前都弄過,所以基本上很快...