歐拉回路,尤拉道路,七橋問題,Python程式碼實現
阿新 • • 發佈:2018-12-14
-
在尤拉道路中,進和出是對應的,除了起點和終點外,其他點的進出次數應該相等。也就是說,除起點和終點外其他各點的度數應該是偶數。
-
如果奇點不存在,則可以從任意點出發,最終一定會回到起點,稱為歐拉回路
-
python程式碼實現,如果存在歐拉回路或尤拉道路則輸出所有可能的路徑
# eulerEdges = [
# (0, 1),
# (0, 2),
# (2, 3),
# (1, 3)
# ]
# 七橋
eulerEdges = [
(1, 2),
(1, 2),
(1, 0),
(2, 0),
(2, 3),
( 2, 3),
(3, 0)
]
start = 1 # 如果是尤拉道路必須從奇點開始
visited = [0 for i in range(len(eulerEdges))] #訪問過的路
queue = [] # 儲存路徑資訊
eulerFlag = False
def isEuler():
allVisited = True
for e in visited:
if e == 0:
allVisited = False
if allVisited:
if queue[0] == queue[len(queue) - 1]:
return 1
else:
return 2
return 0
def printPath(flag):
if flag == 1:
print("是歐拉回路:", end="")
else:
print("是尤拉道路:", end="")
for i in range(len(queue)):
if i < len(queue) - 1:
print(queue[i], "-> ", end="")
else:
print(queue[i])
# 搜尋過程只儲存一條路的狀態的資訊,搜尋結束後queue,visited會恢復為初始狀態
def dfs(u):
queue.append(u)
flag = isEuler() # 判斷當前路徑是不是尤拉路,如果是則列印
if flag > 0:
eulerFlag = True
printPath(flag)
for i in range(len(eulerEdges)):
if visited[i] == 1:
continue
edge = eulerEdges[i]
if edge[0] == u:
visited[i] = 1
dfs(edge[1])
queue.pop() # 將搜尋過的點彈出佇列
visited[i] = 0 # 重置訪問狀態
elif edge[1] == u:
visited[i] = 1
dfs(edge[0])
queue.pop() # 將搜尋過的點彈出佇列
visited[i] = 0 # 重置訪問狀態
dfs(start)
if not eulerFlag:
print("不是歐拉回路或尤拉道路")