參考鏈接: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
