1. 程式人生 > >Python資料結構——圖(graph)

Python資料結構——圖(graph)

圖由頂點和邊組成。如果圖中頂點是有序的,則稱之為有向圖。

由頂點組成的序列,稱為路徑。

除了可以對圖進行遍歷外,還可以搜尋圖中任意兩個頂點之間的最短路徑。

在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']