參考鏈接:https://blog.csdn.net/u014281392/article/details/79120406
所描述的圖的結構為:
下面介紹不同的儲存方式,我想不必詳細分別是每個名稱都是那種數據來存儲的,或是一種,或是兩種的組合,這不是再通用的規定約束而來的結果,只是列舉了一些靈活的組合而已。
1.鄰接集合
鄰接集合就是把頂點的鄰接點放在一個集合中
# 將節點的編號賦值給相應的節點,方便操作 a, b, c, d, e, f, g, h = range(8) N = [{'b', 'c', 'd', 'e', 'f'}, {'c', 'e'}, {'d'}, {'e'}, {'f'}, {'c', 'g', 'h'}, {'f', 'h'}, {'f', 'g'}] 列表中每個集合是每個節點鄰接點集 在python2.7中,set([1,3])這樣表示,set()表示空集合. 在python3之后的版中,set{1,3}表示集合,空集合仍用set()表示.
#查看a的鄰接節點有哪些 N[a] {'b', 'c', 'd', 'e', 'f'} # 檢查g是否為a的一個鄰接節點 'g' in N[a] False # 節點a的度 len(N[a]) 5
2.鄰接列表
數據結構和鄰接集合差不多,唯一的不同是用列表來儲存
# 表示同一個圖 a, b, c, d, e, f, g, h = range(8) N = [ ['b', 'c', 'd', 'e', 'f'], ['c', 'e'], ['d'], ['e'], ['f'], ['c', 'g', 'h'], ['f', 'h'], ['f', 'g'] ] # 鄰接列表表示圖結構,與鄰接集合的操作相同
3.鄰接字典
臨界字典與前面兩個的不同之處在於,其不僅采用字典來儲存,字典是鍵值對,鍵值對中的value用來表示邊的權值這一信息,能表示出與鄰居節點之間的關聯性
a, b, c, d, e, f, g, h = range(8) N = [{'b':2, 'c':1, 'd':3, 'e':9, 'f':4}, {'c':4, 'e':3}, {'d':8}, {'e':7}, {'f':5}, {'c':2, 'g':2, 'h':2}, {'f':1, 'h':6}, {'f':9, 'g':8}] #操作 'e' in N[a] True 邊的權值 N[a]['c'] 1
4.嵌套字典
不用添加序號了
# 以上三種圖的表示,都是使用了list類型 # 下面使用嵌套的字典結構 N = {'a':{'b':2, 'c':1, 'd':3, 'e':9, 'f':4}, 'b':{'c':4, 'e':3}, 'c':{'d':8}, 'd':{'e':7}, 'e':{'f':5}, 'f':{'c':2, 'g':2, 'h':2}, 'g':{'f':1, 'h':6}, 'h':{'f':9, 'g':8}}
其他的操作和別的結構相同
# a,e之間鏈接權值 N['a']['e']
4.鄰接矩陣
# 鄰接矩陣,通過一個二維數組,對應圖中的每個節點,使用0,1來表示相關節點是否為當前節點的鄰居 # 可以使用嵌套list實現 a, b, c, d, e, f, g, h = range(8) N = [[0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 1, 1, 0]]
# 檢查a, b是否為相鄰節點,即檢查N[a][b]是否為1 N[a][b] == 1
True
# c節點的度 sum(N[c])
擴展鄰接矩陣,實現一個沒有自循環,對邊加權 、無自循環狀態,對角線元素全部為0 、加權,用權值替換真值 、將不存在的邊設置一個去窮大的權值(float('inf')),或None
a, b, c, d, e, f, g, h = range(8) inf = float('inf') N = [[ 0, 2, 1, 3, 9, 4, inf, inf], [inf, 0, 4, inf, 3, inf, inf, inf], [inf, inf, 0, 8, inf, inf, inf, inf], [inf, inf, inf, 0, 7, inf, inf, inf], [inf, inf, inf, inf, 0, 5, inf, inf], [inf, inf, 2, inf, inf, 0, 2, 2], [inf, inf, inf, inf, inf, 1, 0, 6], [inf, inf, inf, inf, inf, 9, 8, 0]]
# 檢查a,b是否互為相鄰節點,只要鄰接權值不是無窮大 N[a][b] < inf