定義
若圖G中存在這樣一條路徑,使得它恰通過G中每條邊一次,則稱該路徑為歐拉路徑。若該路徑是一個圈,則稱為歐拉(Euler)迴路。
具有歐拉迴路的圖稱為歐拉圖(簡稱E圖)。具有歐拉路徑但不具有歐拉迴路的圖稱為半歐拉圖。
判斷
以下判斷基於此圖的基圖連通。
無向圖存在歐拉迴路的充要條件
一個無向圖存在歐拉迴路,若且唯若該圖所有頂點度數都為偶數,且該圖是連通圖。
有向圖存在歐拉迴路的充要條件
一個有向圖存在歐拉迴路,所有頂點的入度等於出度且該圖是連通圖。
混合圖存在歐拉迴路條件
要判斷一個混合圖G(V,E)(既有有向邊又有無向邊)是歐拉圖,方法如下:
假設有一張圖有向圖G',在不論方向的情況下它與G同構。並且G'包含了G的所有有向邊。那么如果存在一個圖G'使得G'存在歐拉迴路,那么G就存在歐拉迴路。
其思路就將混合圖轉換成有向圖判斷。實現的時候,我們使用網路流的模型。現任意構造一個G'。用Ii表示第i個點的入度,Oi表示第i個點的出度。如果存在一個點k,|Ok-Ik|mod 2=1,那么G不存在歐拉迴路。接下來則對於所有Ii>Oi的點從源點連到i一條容量為(Ii-Oi)/2的邊,對於所有Ii
解法
無向圖歐拉迴路解法
求歐拉迴路的一種解法
下面是無向圖的歐拉迴路輸出代碼:注意輸出的前提是已經判斷圖確實是歐拉迴路。
C語言代碼,不全,請不要直接貼上。
pascal代碼:
求無向圖的歐拉迴路(遞歸實現)
注意record中的點的排列是輸出的倒序,因此,如果要輸出歐拉路徑,需要將record倒過來輸出。
求歐拉迴路的思路:
循環的找到出發點。從某個節點開始,然後查出一個從這個出發回到這個點的環路徑。這種方法不保證每個邊都被遍歷。如果有某個點的邊沒有被遍歷就讓這個點為起點,這條邊為起始邊,把它和當前的環銜接上。這樣直至所有的邊都被遍歷。這樣,整個圖就被連線到一起了。
具體步驟:
1。如果此時與該點無相連的點,那么就加入路徑中
2。如果該點有相連的點,那么就加入佇列之中,遍歷這些點,直到沒有相連的點。
3。處理當前的點,刪除走過的這條邊,並在其相鄰的點上進行同樣的操作,並把刪除的點加入到路徑中去。
4。這個其實是個遞歸過程。