Python資料結構——圖(graph)
阿新 • • 發佈:2018-11-19
圖由頂點和邊組成。如果圖中頂點是有序的,則稱之為有向圖。
由頂點組成的序列,稱為路徑。
除了可以對圖進行遍歷外,還可以搜尋圖中任意兩個頂點之間的最短路徑。
在python中,可利用字典 {鍵:值} 來建立圖。
圖中的每個頂點,都是字典中的鍵,該鍵對應的值為“該頂點所指向的圖中其他的頂點”。
# -*- coding:utf-8 -*- # file: pygraph.py # def searchGraph(graph, start, end): # 搜尋樹 results = [] generatePath(graph, [start], end, results) # 生成路徑 results.sort(key=lambda x:len(x)) # 按路徑長短排序 return results def generatePath(graph, path, end, results): # 生成路徑 state = path[-1] if state == end: results.append(path) else: for arc in graph[state]: if arc not in path: generatePath(graph, path + [arc], end, results) if __name__ == '__main__': Graph = {'A': ['B', 'C', 'D'], # 構建樹 'B': ['E'], 'C': ['D', 'F'], 'D': ['B', 'E', 'G'], 'E': [], 'F': ['D', 'G'], 'G': ['E']} r = searchGraph(Graph, 'A','D') # 搜尋A到D的所有路徑 print('************************') print(' path A to D') print('************************') for i in r: print(i) r = searchGraph(Graph, 'A','E') # 搜尋A到E的所有路徑 print('************************') print(' path A to E') print('************************') for i in r: print(i) r = searchGraph(Graph, 'C','E') # 搜尋C到E的所有路徑 print('************************') print(' path C to E') print('************************') for i in r: print(i)
執行結果如下:
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>> == RESTART: G:\pygraph.py == ************************ path A to D ************************ ['A', 'D'] ['A', 'C', 'D'] ['A', 'C', 'F', 'D'] ************************ path A to E ************************ ['A', 'B', 'E'] ['A', 'D', 'E'] ['A', 'C', 'D', 'E'] ['A', 'D', 'B', 'E'] ['A', 'D', 'G', 'E'] ['A', 'C', 'D', 'B', 'E'] ['A', 'C', 'D', 'G', 'E'] ['A', 'C', 'F', 'D', 'E'] ['A', 'C', 'F', 'G', 'E'] ['A', 'C', 'F', 'D', 'B', 'E'] ['A', 'C', 'F', 'D', 'G', 'E'] ************************ path C to E ************************ ['C', 'D', 'E'] ['C', 'D', 'B', 'E'] ['C', 'D', 'G', 'E'] ['C', 'F', 'D', 'E'] ['C', 'F', 'G', 'E'] ['C', 'F', 'D', 'B', 'E'] ['C', 'F', 'D', 'G', 'E']