1. 程式人生 > >圖的實現(python)

圖的實現(python)

比如有這麼一張圖:

這裡寫圖片描述

(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