def:单源最短路径既从节点s出发到其他的所有能到达的节点的的最短路径。
对于存在权重为负数的边,只要这边不形成环,或者整个环路的权重大于零则可以认为最短路径依然有解。
我们使用前驱子图来表现最短路径
我们使用如下代码来表示图与最短路径:
class Vertex:
def __init__(self, u):
self.value = u
self.vertexs = []
self.isInGraph = False
self.pi = None
self.d = float("inf")
class Edge:
def __init__(self, u, v, w):
self.fromV = u
self.toV = v
self.weight = w
class Graph:
def __init__(self):
self.vertexs = []
self.edges = []
def weight(edges, u, v):
for e in edges:
if e.fromV == u and e.toV == v:
return e.weight
return None
def INITGRAPH(G, edges):
for e in edges:
if not e.fromV.isInGraph:
G.vertexs.append(e.fromV)
e.fromV.isInGraph = True
if not e.toV.isInGraph:
G.vertexs.append(e.toV)
e.toV.isInGraph = True
G.edges.append(e)
e.fromV.vertexs.append(e.toV)
#e.toV.vertexs.append(e.fromV)
初始化与松弛操作(初始化最短路径与前驱子图,改进最短路径估计与前驱子图):
def INITIALIZE_SINGLE_SOURCE(G, s):
for v in G.vertexs:
v.d = float("inf")
s.d = 0
def RELAX(u, v, edges):
if v.d > u.d + weight(edges, u, v):
v.d = u.d + weight(edges, u, v)
v.pi = u
print(u.value, v.value, v.d)
并具有如下性质:
24.1 BELLMAN_FORD算法
def BELLMAN_FORD(G, s):
INITIALIZE_SINGLE_SOURCE(G, s)
for i in range(1, len(G.vertexs)-1):
for edge in G.edges:
RELAX(edge.fromV, edge.toV, G.edges)
for edge in G.edges:
if edge.toV.d > edge.fromV.d + weight(edges, edge.fromV, edge.toV):
return False
return True
if __name__ == "__main__":
s = Vertex('s')
t = Vertex('t')
x = Vertex('x')
y = Vertex('y')
z = Vertex('z')
edges = []
edges.append(Edge(x, t, -2))
edges.append(E