尤拉通路: 通過圖中每條邊且只通過一次,並且經過每一頂點的通路
尤拉迴路: 通過圖中每條邊且只通過一次,並且經過每一頂點的迴路
有向圖的基圖:忽略有向圖所有邊的方向,得到的無向圖稱為該有向圖的基圖。
無向圖設g是連通無向圖,則稱經過g的每條邊一次並且僅一次的路徑為尤拉通路;
如果尤拉通路是迴路(起點和終點是同乙個頂點),則稱此迴路是尤拉迴路
具有尤拉迴路的無向圖g成為尤拉圖
有向圖(1)設d是有向圖,d的基圖連通,則稱經過d的每條邊一次並且僅有一次的有向路徑為 有向尤拉通路
(2)如果有向尤拉通路是有向迴路,則稱此有向迴路為 有向尤拉迴路
(3)具有有向尤拉迴路的圖d稱為有向尤拉圖定理
無向圖g存在尤拉通路的充要條件是:g為連通圖,並且g僅有兩個奇度結點(度數為奇數的頂點)或者無奇度結點。 推論
(1) 當g是僅有兩個奇度結點的連通圖時,g的尤拉通路必以此兩個結點為端點;
(2)當g是無奇度結點的連通圖時,g必有尤拉迴路
(3)g為尤拉圖(存在尤拉迴路)的充分必要條件是 g為無奇度結點的連通圖
(有向圖) 定理
有向圖d存在尤拉通路的充要條件是:d為有向圖,d的基圖連通,並且所有頂點的出度與入度相等;或者 除兩個頂點外,其餘頂點的出度與入度都相等,而這兩個頂點中乙個頂點的出度與入度之差為1,另乙個頂點的出度與入度之差為-1. 推論
(1)當d除出、入度之差為1,-1的兩個頂點之外,其餘頂點的出度與入度相等時,d的有向尤拉通路必以出、入度之差為1的頂點作為始點,以出、入度之差為-1的頂點作為終點。
(2)當d的所有頂點的出、入度都相等時,d中存在有向尤拉迴路。
(3)有向圖d為有向尤拉圖的充要條件是 d的基圖為連通圖,並且所有頂點的出、入度都相等。
尤拉迴路的求解
兩種方法:(1)dfs搜尋 (fleury)佛羅萊演算法
(1)dfs搜尋 思想求解尤拉迴路的思路為:利用尤拉定理判斷出乙個圖存在尤拉通路或尤拉迴路後,選擇乙個正確的起始頂點,用dfs演算法遍歷所有的邊(每條邊只遍歷一次),遇到走不通就回退。在搜尋前進方向上將遍歷過的邊按順序記錄下來。這組邊的排列就組成了一條尤拉通路或迴路。
(2) (fleury)佛羅萊演算法
設g為乙個無向尤拉圖,求g中一條尤拉迴路的演算法如下:
(1) 任取g中一頂點v0,令p0=v0;
(2)假設沿pi=v0e1v1e2v2......eivi走到頂點vi,按下面方法從e(g)-中選ei+1。
ei+1與vi相關聯
除非無別的邊可供選擇,否則ei+1不應該是gi=g-中的橋。
(3)當(2)不能再進行時演算法停止。
可以證明的是,當演算法停止時,所得到的簡單迴路pm=v0e1v1e2v2......emvm,(vm=v0)為g中一條尤拉迴路。
備註知識:
設無向圖g(v,e)為連通圖,若邊集e1屬於e,在圖g中刪除e1中所有的邊後得到的子圖是不連通的,而刪除了e1的任一真子集後得到的子圖是連通圖,則稱e1是g的乙個割邊集。若一條邊構成乙個割邊集,則稱該邊為割邊,或橋 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//尤拉路徑的輸出(此圖為無向圖)
#include
using
namespace
std;
#define m 200
struct
stack
s;
//頂點的棧結構
int
edge[m][m];
//鄰接矩陣
int
n;
//頂點個數
void
dfs(
int
x)
//這裡的深度優先跟標準版有所區別,即不需要回溯
}
}
void
fleury(
int
x)
//對頭節點使用fleury演算法 查詢尤拉路徑
}
if
(!flag)
else
}
cout<}
int
main()
num=0;
start=0;
//如果存在奇度頂點,則從奇度頂點出發,否則從頂點0出發
for
(
int
i=0;i
}
if
(num==0||num==2) fleury(start);
else
cout<<
"no euler path"
<
return
0;
}
練習:單詞(
具體大意:
輸入n(n<=100000)個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同(例如 acm、malfon、mouse)。每個單詞最多包含1000個小寫字母,輸入中可以有重複單詞。
分析:把字母看做節點,單詞看成有向邊,則問題有解,當且僅當圖中有尤拉路徑。前面講過,有向圖存在尤拉道路的條件有兩個:底圖(忽略邊方向後得到的無向圖)連通,且度數滿足上面討論過的條件。判斷連通的方法有兩種,一是之前介紹過的dfs,二是並查集,可以按照自己喜好選用。
尤拉道路和尤拉迴路
尤拉道路 能否從無向圖中的乙個節點出發走出一條道路,每條邊恰好經過一次 尤拉迴路 在尤拉道路的基礎上要回到原點 不難發現在尤拉道路中,除了起點和終點外,其他點的進出次數應該相等 換句話說除了起點和終點外,其他點的度數應該是偶數 則如果乙個圖是聯通的,且最多只有兩個奇點,則一定存在尤拉道路 如果奇點不...
尤拉道路與尤拉迴路
尤拉道路與尤拉迴路 尤拉道路 通過圖g中每條邊一次且僅一次的道路稱作該圖的尤拉道路。尤拉迴路 通過圖g中每條邊一次且僅一次的迴路稱作該圖的尤拉迴路。尤拉圖 存在尤拉迴路的圖稱為尤拉圖。尤拉在1736年給出了尤拉道路 迴路存在的必要條件,在1873年希爾霍爾策首次給出了刻畫尤拉圖的充要條件。定理 a ...
尤拉路和尤拉迴路
尤拉環 圖中經過每條邊一次且僅一次的環 尤拉路徑 圖中經過每條邊一次且僅一次的路徑 尤拉圖 有至少乙個尤拉環的圖 半尤拉圖 沒有尤拉環,但有至少一條尤拉路徑的圖。無向圖 乙個無向圖是尤拉圖當且僅當該圖是連通的 注意,不考慮圖中度為0的點,因為它們的存在對於圖中是否存在尤拉環 尤拉路徑沒有影響 且所有...