1. 程式人生 > >歐拉回路,尤拉道路,七橋問題,Python程式碼實現

歐拉回路,尤拉道路,七橋問題,Python程式碼實現

  • 尤拉道路中,進和出是對應的,除了起點和終點外,其他點的進出次數應該相等。也就是說,除起點和終點外其他各點的度數應該是偶數。

  • 如果奇點不存在,則可以從任意點出發,最終一定會回到起點,稱為歐拉回路

  • 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("不是歐拉回路或尤拉道路")