這篇文章介紹了尤拉環遊的定義判定,fleury演算法求尤拉圖中的尤拉環遊,最後給出了中國郵遞員問題的解決步驟。
所謂尤拉環遊就是指在乙個無向圖中,從乙個點出發,每條邊恰好走一次並且能夠回到原點的路徑。舉個例子,下圖中路徑abcd就是乙個尤拉環遊。這種包含了尤拉環遊的圖叫尤拉圖。
圖1 乙個尤拉圖
那麼,給定乙個圖,我們應該怎麼判定它是否是尤拉圖呢?很簡單。
非 空連
接圖g是
尤拉圖⇔
所有頂點
的度為偶
數\color非空連線圖g是尤拉圖\leftrightarrow所有頂點的度為偶數
非空連線圖g
是尤拉圖
⇔所有頂
點的度為
偶數。這裡不作證明。
那麼給定乙個尤拉圖,我們應該如何求尤拉環遊呢?這裡有一種fleury演算法,可以求解。fleury演算法很簡單,簡單概括就是過河拆橋,盡量不走獨木橋
演算法流程:
任取乙個頂點v
0v_0
v0,令w0=
v0w_0 = v_0
w0=v0
路w i=
v0e1
v1..
.eiv
iw_i = v_0e_1v_1...e_iv_i
wi=v0
e1
v1.
..ei
vi
已經確定,在圖中拆除路**現的邊,選擇一條邊ei+
1e_ei+1
使得
如果選不出ei+
1e_ei+1
,結束。否則得到路wi+
1=v0
e1v1
...e
iviw
i+1v
i+1w_= v_0e_1v_1...e_iv_iw_v_
wi+1=
v0e
1v1
...
eiv
iwi
+1v
i+1
,e i+
1e_ei+1
連線v
iv_i
vi和vi+
1v_vi+1
,轉到2。
演算法複雜度:
設頂點個數為v
vv,邊數為ϵ
\epsilon
ϵ,那麼演算法複雜度為o(v
2ϵ)o(v^2\epsilon)
o(v2ϵ)
遍歷每條邊,並且判斷這條邊是否為割邊,判斷一條邊是否為割邊複雜度為o(v
2)o(v^2)
o(v2
),所以該演算法的演算法複雜度為o(v
2ϵ)o(v^2\epsilon)
o(v2ϵ)
演算法**:
圖2 演算法**
講了半天尤拉環遊,接下來我們講講它的使用例子。我國數學家管梅谷中國郵遞員問題(chinese postman problem, cpp)。乙個郵遞員從郵局出發,走完所有他所管轄街道各一次,最後返回郵局,如何選擇一條最短路線。這是個求最優環遊問題(遍歷所有邊回到原點並且邊權重和最小),我們可以把這個問題轉換為尤拉環遊問題。
新增重複邊,從原來的圖中生成尤拉圖,並且使得新增的邊權重和最小。
求尤拉環遊。
管梅谷證明,一條邊最多被重複走兩次。
這裡直接給出求解中國郵遞員問題的步驟:
找出圖g
gg中鄰接邊為奇數的頂點,將這些鄰接邊為奇數頂點兩兩配對,將連通兩者的路徑上面的邊都改為加上一條重複邊。
若某對結點間有多於兩條邊連線,則去掉其中偶數條邊,留下一條或兩條邊連線這兩個結點,直到每對相鄰結點至多由2條邊連線。
檢查每個圈c
cc,若某個圈c
cc上重複邊集e
ee的權和超過這個圈的權和的一半,則將c
cc中原來的重複邊去除,將原來的沒有重複邊的邊加上重複邊,直到所有的圈其重複邊的權和不超過此圈權和的一半
用fleury演算法求尤拉迴路。
演算法**
圖3 中國郵遞員演算法**
YCOJ中國郵遞員問題
題目 description 乙個郵遞員從郵局出發,需要去 n 2個城市送信,送完信件以後回家。郵局在城市 1,家在城市 n,任意兩個城市之間都有道路,但是這些道路是單向,也就是說 a 到 b 和 b 到 a 的路徑長度不一定是一樣的。他必須經過每個城市一次,並且不能重複經過,最後回到家裡。現在要求...
尤拉迴路 郵遞員
題目 郵遞員 描述 郵局需要你來幫助他們為某個郵遞員設計出一條能夠穿過那遙遠鄉村的所有村子和小路至少一次的郵路 輸入資料將會保證這麼一條路是一定存在的 但是,每條路線都是有乙個花費的。各個村子裡的村民希望郵遞員到達他們村子的時間越早越好。因此,各個村子裡的人們採用了一些措施 假設第i號村子是郵遞 員...
ArcGIS網路分析之中國郵遞員問題
中國郵遞員問題是郵遞員在某一地區的信件投遞路程問題。郵遞員每天從郵局出發,走遍該地區所有街道再返回郵局,問題是他應如何安排送信的路線可以使所走的總路程最短。使用路徑分析,如果使用網路交匯點作為停靠點,那麼有些路 下圖中黑色線 還是無法經過。我們可以使用每條路的中心點作為停靠點,這樣就可以經過每條道路...