class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = []
def addEdge(self, u, v, w):
self.graph.append([u, v, w])
def printArr(self, dist):
print("Vertex Distance from Source")
for i in range(self.V):
print("{0}\t\t{1}".format(i, dist[i]))
def BellmanFord(self, src):
dist = [float("Inf")] * self.V
dist[src] = 0
for _ in range(self.V - 1):
for u, v, w in self.graph:
if dist[u] != float("Inf") and dist[u] + w < dist[v]:
dist[v] = dist[u] + w
for u, v, w in self.graph:
if dist[u] != float("Inf") and dist[u] + w < dist[v]:
print("Graph contains negative weight cycle")
return
self.printArr(dist)
if __name__ == '__main__':
g = Graph(5)
g.addEdge(0, 1, -1)
g.addEdge(0, 2, 4)
g.addEdge(1, 2, 3)
g.addEdge(1, 3, 2)
g.addEdge(1, 4, 2)
g.addEdge(3, 2, 5)
g.addEdge(3, 1, 1)
g.addEdge(4, 3, -3)
g.BellmanFord(0)
Y2xhc3MgR3JhcGg6CgoJZGVmIF9faW5pdF9fKHNlbGYsIHZlcnRpY2VzKToKCQlzZWxmLlYgPSB2ZXJ0aWNlcwoJCXNlbGYuZ3JhcGggPSBbXQoKCWRlZiBhZGRFZGdlKHNlbGYsIHUsIHYsIHcpOgoJCXNlbGYuZ3JhcGguYXBwZW5kKFt1LCB2LCB3XSkKCglkZWYgcHJpbnRBcnIoc2VsZiwgZGlzdCk6CgkJcHJpbnQoIlZlcnRleCBEaXN0YW5jZSBmcm9tIFNvdXJjZSIpCgkJZm9yIGkgaW4gcmFuZ2Uoc2VsZi5WKToKCQkJcHJpbnQoInswfVx0XHR7MX0iLmZvcm1hdChpLCBkaXN0W2ldKSkKCglkZWYgQmVsbG1hbkZvcmQoc2VsZiwgc3JjKToKCgkJZGlzdCA9IFtmbG9hdCgiSW5mIildICogc2VsZi5WCgkJZGlzdFtzcmNdID0gMAoKCQlmb3IgXyBpbiByYW5nZShzZWxmLlYgLSAxKToKCQkJZm9yIHUsIHYsIHcgaW4gc2VsZi5ncmFwaDoKCQkJCWlmIGRpc3RbdV0gIT0gZmxvYXQoIkluZiIpIGFuZCBkaXN0W3VdICsgdyA8IGRpc3Rbdl06CgkJCQkJZGlzdFt2XSA9IGRpc3RbdV0gKyB3CgoJCWZvciB1LCB2LCB3IGluIHNlbGYuZ3JhcGg6CgkJCWlmIGRpc3RbdV0gIT0gZmxvYXQoIkluZiIpIGFuZCBkaXN0W3VdICsgdyA8IGRpc3Rbdl06CgkJCQlwcmludCgiR3JhcGggY29udGFpbnMgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlIikKCQkJCXJldHVybgoKCQlzZWxmLnByaW50QXJyKGRpc3QpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgoJZyA9IEdyYXBoKDUpCglnLmFkZEVkZ2UoMCwgMSwgLTEpCglnLmFkZEVkZ2UoMCwgMiwgNCkKCWcuYWRkRWRnZSgxLCAyLCAzKQoJZy5hZGRFZGdlKDEsIDMsIDIpCglnLmFkZEVkZ2UoMSwgNCwgMikKCWcuYWRkRWRnZSgzLCAyLCA1KQoJZy5hZGRFZGdlKDMsIDEsIDEpCglnLmFkZEVkZ2UoNCwgMywgLTMpCgoJZy5CZWxsbWFuRm9yZCgwKQ==