圖的常用演算法的 python 實現—鄰接表表示法
阿新 • • 發佈:2019-01-30
#圖的鄰接連結串列表示法 graph = {'A': ['B', 'C'], 'B': ['C', 'D'], 'C': ['D'], 'D': ['C','G','H'], 'E': ['F'], 'F': ['C']} #從圖中找出任意一條從起始頂點到終止頂點的路徑 def find_path(graph, start, end, path=[]): if start == end: print "path", path return True if not graph.get(start): path.pop() return False for v in graph[start]: if v not in path: path.append(v) if find_path(graph,v,end,path): return True return False path = [] if find_path(graph, 'A', 'C', path=path): print(path) else: print(1) #從圖中找出從起始頂點到終止頂點的所有路徑 import copy def find_path_all(curr, end, path): ''' :param curr: 當前頂點 :param end: 要到達的頂點 :param path: 當前頂點的一條父路徑 :return: ''' if curr == end: path_tmp = copy.deepcopy(path) path_all.append(path_tmp) return if not graph.get(curr): return for v in graph[curr]: #一個頂點在當前遞迴路徑中只能出現一次,否則會陷入死迴圈。 if v in path: print("v %s in path %s" %(v, path)) continue #構造下次遞迴的父路徑 path.append(v) find_path_all(v,end,path) path.pop() path_all = [] find_path_all('A', 'G',path=['A']) print path_all #遍歷圖中所有頂點,按照遍歷順序將頂點新增到列表中 vertex = [] def dfs(v): if v not in graph: return for vv in graph[v]: if vv not in vertex: vertex.append(vv) dfs(vv) for v in graph: if v not in vertex: vertex.append(v) dfs(v) print(vertex)