您可以使用字典字典,并且只将边缘及其权重存储一次。使用函数访问权重将允许您根据需要反转参数顺序以获取和设置权重值。
def getWeight(adj,a,b):
return getWeight(adj,b,a) if a>b else adj.get(a,{}).get(b,0)
def setWeight(adj,a,b,w):
if a>b: setWeight(adj,b,a,w)
else: adj.setdefault(a,{})[b] = w
edges = [('A','B',1),('A','C',2),('C','D',3)]
adj = {v:{} for e in edges for v in e[:2]}
for a,b,w in edges:
setWeight(adj,a,b,w)
输出:
print(adj)
{'A': {'B': 1, 'C': 2}, 'B': {}, 'C': {'D': 3}, 'D': {}}
print(getWeight(adj,'B','A')) # 1
print(getWeight(adj,'A','B')) # 1
print(getWeight(adj,'D','A')) # 0
如果您在另一个列表中的某处有顶点,则只需将边权重存储在字典中,这将使其内存效率稍高:
def getWeight(adj,a,b):
return adj[a,b] if (a,b) in adj else adj.get((b,a),0)
def setWeight(adj,a,b,w):
if (b,a) in adj: adj[b,a] = w
else: adj[a,b] = w
edges = [('A','B',1),('A','C',2),('C','D',3)]
adj = {(a,b):w for a,b,w in edges}
print(adj)
{('A', 'B'): 1, ('A', 'C'): 2, ('C', 'D'): 3}
print(getWeight(adj,'B','A')) # 1
print(getWeight(adj,'A','B')) # 1
print(getWeight(adj,'D','A')) # 0