圖的實現(python)
阿新 • • 發佈:2019-01-03
比如有這麼一張圖:
(1)可以用字典和列表來表示
graph = {'V0':['V1','V5'],
'V1':['V2'],
'V2':['V3'],
'V3':['V4','V5'],
'V4':['V0'],
'V5':['V2','V4']}
找到一條路徑:
def find_path(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
if not graph.has_key(start):
return None
for node in graph[start]:
if node not in path:
newpath = find_path(graph, node, end, path)
if newpath: return newpath
return None
找到所有路徑:
def find_all_paths(graph, start, end, path=[]) :
path = path + [start]
if start == end:
return [path]
if not graph.has_key(start):
return []
paths = []
for node in graph[start]:
if node not in path:
newpaths = find_all_paths(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
找到最短路徑:
def find_shortest_path(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
if not graph.has_key(start):
return None
shortest = None
for node in graph[start]:
if node not in path:
newpath = find_shortest_path(graph, node, end, path)
if newpath:
if not shortest or len(newpath) < len(shortest):
shortest = newpath
return shortest
(2) 鄰接矩陣
會將每個結點可能的鄰居位置排成一行(也就是一個數組,用於對應圖中每一個結點),然後用某種值(如True或False)來表示相關結點是否為當前結點的鄰居。為了讓矩陣具有更好的可讀性,我們將會用1和0來充當所謂的真值(也可用True和False)。
v0,v1,v2,v3,v4,v5=range(6)
N=[[0,1,0,0,0,1],#v0
[0,0,1,0,0,0],#v1
[0,0,0,1,0,0],#v2
[0,0,0,0,1,1],#v3
[1,0,0,0,0,0],#v4
[0,0,1,0,1,0]]#v5
>>> N[v0][v1]
1
>>> sum(N[v0])
2
將鄰接矩陣擴充套件成允許對邊進行加權處理:在原來儲存真值的地方直接儲存相關的權值即可。例如,對於邊(u,v)來說,我們只需要將N[u][v]處的True替換成w(u,v)即可,我們通常會將一些不存在的邊的權值設定為無窮大。
對角線上的值依舊應該全為0,任何節點到自身的距離都應該始終為0。
把上面的程式碼改為:
v0,v1,v2,v3,v4,v5=range(6)
inf=float('inf')
w=N=[[inf,5,inf,inf,inf,2],#v0
[inf,inf,4,inf,inf,inf],#v1
[inf,inf,inf,9,inf,inf],#v2
[inf,inf,inf,inf,7,3],#v3
[1,inf,inf,inf,inf,inf],#v4
[inf,inf,1,inf,8,inf]]#v5
>>>w[v0][v1]
Out[6]:
5
>>>w[v2][v1]
Out[7]:
inf