一、無向圖
每個(gè)頂點(diǎn)的度數(shù)都是偶數(shù),則存在歐拉回路。
二、有向圖(所有邊都是單向的)
每個(gè)節(jié)頂點(diǎn)的入度都等于出度,則存在歐拉回路。
以上兩種情況都很好理解。其原理就是每個(gè)頂點(diǎn)都要能進(jìn)去多少次就能出來多少次。
三、混合圖(有的邊是單向的,有的邊是無向的。常被用于比喻城市里的交通網(wǎng)絡(luò),有的路是單行道,有的路是雙行道。)
找到一個(gè)給每條無向的邊定向的策略,使得每個(gè)頂點(diǎn)的入度等于出度,這樣就能轉(zhuǎn)換成上面第二種情況。這就可以轉(zhuǎn)化成一個(gè)二部圖最大匹配問題。網(wǎng)絡(luò)模型如下:
1. 新建一個(gè)圖。
2. 對于原圖中每一條無向邊i,在新圖中建一個(gè)頂點(diǎn)e(i);
3. 對于原圖中每一個(gè)頂點(diǎn)j,在新圖中建一個(gè)頂點(diǎn)v(j)。
4. 如果在原圖中,頂點(diǎn)j和k之間有一條無向邊i,那么在新圖中從e(i)出發(fā),添加兩條邊,分別連向v(j)和v(k),容量都是1。
5. 在新圖中,從源點(diǎn)向所有e(i)都連一條容量為1的邊。
6. 對于原圖中每一個(gè)頂點(diǎn)j,它原本都有一個(gè)入度in、出度out和無向度un。顯然我們的目的是要把所有無向度都變成入度或出度,從而使它的入度等于總度數(shù)的一半,也就是(in + out + un) / 2(顯然與此同時(shí)出度也是總度數(shù)的一半,如果總度數(shù)是偶數(shù)的話)。當(dāng)然,如果in已經(jīng)大于總度數(shù)的一半,或者總度數(shù)是奇數(shù),那么歐拉回路肯定不存大。如果in小于總度數(shù)的一半,并且總度數(shù)是偶數(shù),那么我們在新圖中從v(j)到匯點(diǎn)連一條邊,容量就是(in + out + un) / 2 – in,也就是原圖中頂點(diǎn)j還需要多少入度。
按照這個(gè)網(wǎng)絡(luò)模型算出一個(gè)最大流,如果每條從v(j)到匯點(diǎn)的邊都達(dá)到滿流量的話,那么歐拉回路成立。
這個(gè)算法可以用在ZJU#1992(http://acm.zju.edu.cn/show_problem.php?pid=1992)
弗羅萊(Fleury)算法求歐拉回路
算法輪廓:
(1)任取v0∈V(G),令P0=v0.
(2)設(shè)Pi=v0e1v1e2…eivi已經(jīng)行遍,按下面方法來從E(G)-{e1,e2,…,ei}中選取ei+1:
(a)ei+1與vi相關(guān)聯(lián);
(b)除非無別的邊可供行遍,否則ei+1不應(yīng)該為Gi=G-{e1,e2,…,ei}中的橋。
(3)當(dāng)(2)不能再進(jìn)行時(shí),算法停止。
可以證明,當(dāng)算法停止時(shí)所得簡單回路Pm=v0e1v1e2…emvm(vm=v0)為G中一條歐拉回路。
程序文件夾:33333
//輸入一個(gè)無向圖,先判斷是否存在歐拉路,若有求出一條歐拉路
/先輸入頂點(diǎn)數(shù)和邊數(shù),之后輸入每條邊連接的2個(gè)點(diǎn)
//例如
//5 6 (5個(gè)點(diǎn),6條邊)
//1 2
//1 3
//2 3
//2 5
//2 4
//4 5

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

86

87

88

89

90

91

92

93

94
