1. 程式人生 > >歐拉回路(Euler Circuit)

歐拉回路(Euler Circuit)

定義:若一副圖中從某個頂點A走出,經過圖中的所有的邊,且每條邊只經過一次,則稱這個環為歐拉回路,如果某幅圖含有這樣的環,則這幅圖叫做尤拉圖。

如何判斷一幅圖是不是尤拉圖,也即一幅圖中是否含有歐拉回路。

  • 如果一幅圖中所有頂點的出度等於入度,且此圖為強連通圖,則此圖含有歐拉回路,這幅圖為尤拉圖。
如何在程式中實現判斷一副圖是否含有歐拉回路呢?如果存在,則將路徑打印出來。

判斷是否為存在歐拉回路可以直接利用上面的判斷定理,但是打印出相應的路徑就相對困難一些。

假設圖G為一副含有歐拉回路的圖,也即尤拉圖。

  • 隨機選取G中的一個頂點A,如果A不存在沒有訪問過的邊,則將A加入路徑
  • 如果A存在沒有訪問過的邊,則隨機取出A的一條未訪問過的邊進行訪問,此時訪問的頂點為B。
  • 重複上述兩步,直到所有的邊都被訪問過為止。
  • 此時就得到了相應的歐拉回路。
為什麼通過上面的方法能夠得到歐拉回路呢?
  • 首先隨機選擇一個頂點A,進行路徑尋找,最終會找到一個以A為起點和終點的環。
  • 此時如果不存在沒有訪問過的邊,則這個環就為尤拉環。
  • 如果存在沒有訪問過的邊,則我們可以知道,要想得到完整的尤拉環,必須先訪問未訪問過的邊,為此說明此時的環A中含有某個頂點C,其存在沒有訪問過的邊
  • 從C開始訪問C未訪問過的邊,必得到一個以C為起點和終點的環,此時將這個環加入到A中,這就得到了我們想要的尤拉環。
如上圖所示,先訪問頂點A,之後得到紅色的環,此時C,D,E三個頂點組成的環沒有被訪問,且C存在未被訪問的邊,因此在歐拉回路中,C,D,E組成的環應該先被訪問,為此將A,B加入路徑,然後C開始訪問D,E,C,分別將之後分別將其壓入路徑,從而得到想要的路徑為A,C,D,E,C,B,A。