1. 程式人生 > >尤拉路&歐拉回路

尤拉路&歐拉回路

前段時間在洛谷上碰到了這個,今天剛好離散課上又講,做個小總結。

一:定義:

1:尤拉路:在一個連通圖中存在一條路,經過途中所有邊一次且僅一次,這條路叫做尤拉路。

2:歐拉回路:在一個連通圖中存在一條路,經過途中所有邊一次且僅一次,出發點亦是終點,這樣的路是歐拉回路。

二:無向圖:

判斷法:(以下都是充分必要條件)

1:無向圖有一條尤拉路<=>圖是連通的,且全部的結點的度是偶數(就是歐拉回路的情況)或只有兩個結點的度是奇數。

2:無向圖有一條歐拉回路<=>圖是連通的,且全部的結點的度是偶數。

程式碼實現思路:

我們可以設定一個count[]陣列,直接遍歷所有的邊,將遍歷到的結點的度數++就行了,最後再進行判斷。

三:有向圖

判斷法:(以下都是充分必要條件)

1:有向圖有一條尤拉路<=>當前圖是連通的,且只有兩個點滿足入度!=出度,且這兩個點的中,一個結點的入度比出度大1,另一個點的出度比入度大1。其餘的點都是出度等於入度。

2:有向圖有一條歐拉回路<=>當前圖是連通的,且所有的點滿足入度==出度。

程式碼實現思路:

設定兩個陣列in[] out[]分別記錄每一個點的入度出度,然後我們還是直接遍歷所有的邊就行了。

四:怎樣走歐拉回路

你當然可以直接暴力的進行深搜。但是更優的做法是,對於當前的結點,如果我們有很多邊可以走,那我們就先跳過割邊,實在沒有選擇了我們再走割邊。

五:解決的問題

1:一筆畫問題

2:計算機鼓輪問題(挺有意思的一個問題)

等等