1. 程式人生 > >Project-1:設計並實現求無向圖兩點間所有路徑的演算法

Project-1:設計並實現求無向圖兩點間所有路徑的演算法

設計並實現求無向圖兩點間所有路徑的演算法

  • 實驗原理

    • 無向圖的深度優先搜尋:
      假設一個圖 G,圖中所有頂點未曾被訪問過,則深度優先搜尋就是從圖中某個頂點 v 出發,訪問此頂點,然後再從 v 的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和 v 有路徑相通的頂點都被訪問到;若圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。
    • 利用深度優先搜尋獲取兩點間路徑的過程:
      給定一個圖 G,起始節點 a 和目的節點 b,開始時將 a 加入到路徑集合 path[],並將 a 加入到已經訪問節點集合 visited[],然後以 a 為起點運用深度優先演算法對圖進行搜尋,每搜尋到一個節點就將其加入到 path 和 visited 中,當搜尋到目的節點 b 的時候就把路徑打印出來,然後把 b 從 path 和 visited 中移除然後對前一個節點中未被訪問的鄰接節點進行深度優先搜尋,當搜尋到一個節點 v 已經沒有未訪問的鄰接節點時,說明已經“到底”了,那麼此時也要把 v 從 path 和 visited 中移除,然後對其前一個節點的未訪問鄰接節點進行深度優先搜尋直到所有的節點都被搜尋到為止;
  • 實驗步驟

    • 將圖的資料儲存到 Graph.txt 中
    • 設計一個 Graph 類(用鄰接字典)
    • 設計並實現深度優先搜尋找路徑的程式碼
    • 讀取 Graph.txt 建立一個 Graph 物件
    • 執行DFS觀察結果
    • 根據所畫的圖驗證結果
  • 程式碼實現

# 找路徑
def find_path(graph, start_node, destination_node):
    node_num = graph.get_node_num()         # 獲取節點個數
    visited =
[] path = [] for i in range(node_num): # 對所有節點初始化,標記為0是沒有訪問 visited.append(0) dfs(graph, visited, start_node, destination_node, path) # 呼叫深度優先遍歷 # 深度優先遍歷 def dfs(graph, visited, v, destination_node, path): visited[v] = 1 # 標記為已經訪問 path.append(
v) # 將節點v加入到路徑集合中 if v == destination_node: # 如果節點v是目的節點,那麼列印路徑 for i in range(len(path)): if i != len(path)-1: print(path[i], end="->") else: print(path[i]) print("") else: for w in graph.get_node_edge(v): # 如果v不是目的節點,就找到v沒有被訪問到鄰接節點進行深度優先遍歷 if visited[w] == 0: dfs(graph, visited, w, destination_node, path) path.pop(len(path) - 1) # 發現遍歷到底(即v已經沒有未訪問的鄰接節點或者v就已經是目的節點),把v從路徑集合中刪除 visited[v] = 0 # 並將v 設定為未訪問
  • 驗證資料
0 6
0 9
1 2
1 7
1 8
3 1
3 2
3 10
4 5
4 8
1 3
2 1
2 5
2 3
5 4
9 10
9 8
10 3
11 6
11 9
5 2
6 0
6 11
8 4
8 1
8 9
7 1
  • 驗證結果
    驗證結果
  • 微信公眾號(白話資料結構與演算法)
    在這裡插入圖片描述