Skip to content

Commit 92e9250

Browse files
committed
Bellmanford
1 parent 5d6ffde commit 92e9250

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

Graph/bellmanford.py

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import sys;
2+
3+
class Node(object):
4+
5+
def __init__(self, name):
6+
self.name = name;
7+
self.visited = False;
8+
self.predecessor = None;
9+
self.adjacenciesList = [];
10+
self.minDistance = sys.maxsize;
11+
12+
class Edge(object):
13+
14+
def __init__(self, weight, startVertex, targetVertex):
15+
self.weight = weight;
16+
self.startVertex = startVertex;
17+
self.targetVertex = targetVertex;
18+
19+
class BellmanFord(object):
20+
21+
HAS_CYCLE = False;
22+
23+
def calculateShortestPath(self, vertexList, edgeList, startVertex):
24+
25+
startVertex.minDistance = 0;
26+
27+
for i in range(0,len(vertexList)-1):
28+
for edge in edgeList:
29+
30+
u = edge.startVertex;
31+
v = edge.targetVertex;
32+
33+
newDistance = u.minDistance + edge.weight;
34+
35+
if newDistance < v.minDistance:
36+
v.minDistance = newDistance;
37+
v.predecessor = u;
38+
39+
for edge in edgeList:
40+
if self.hasCycle(edge):
41+
print("Negative cycle detected...");
42+
BellmanFord.HAS_CYCLE = True;
43+
return;
44+
45+
def hasCycle(self, edge):
46+
if (edge.startVertex.minDistance + edge.weight) < edge.targetVertex.minDistance:
47+
return True;
48+
else:
49+
return False;
50+
51+
def getShortestPathTo(self, targetVertex):
52+
53+
if not BellmanFord.HAS_CYCLE:
54+
print("Shortest path exists with value: ", targetVertex.minDistance);
55+
56+
node = targetVertex;
57+
58+
while node is not None:
59+
print("%s " % node.name);
60+
node = node.predecessor;
61+
else:
62+
print("Negative cycle detected...");
63+
64+
65+
node1 = Node("A");
66+
node2 = Node("B");
67+
node3 = Node("C");
68+
node4 = Node("D");
69+
node5 = Node("E");
70+
node6 = Node("F");
71+
node7 = Node("G");
72+
node8 = Node("H");
73+
74+
edge1 = Edge(5,node1,node2);
75+
edge2 = Edge(8,node1,node8);
76+
edge3 = Edge(9,node1,node5);
77+
edge4 = Edge(15,node2,node4);
78+
edge5 = Edge(12,node2,node3);
79+
edge6 = Edge(4,node2,node8);
80+
edge7 = Edge(7,node8,node3);
81+
edge8 = Edge(6,node8,node6);
82+
edge9 = Edge(5,node5,node8);
83+
edge10 = Edge(4,node5,node6);
84+
edge11 = Edge(20,node5,node7);
85+
edge12 = Edge(1,node6,node3);
86+
edge13 = Edge(13,node6,node7);
87+
edge14 = Edge(3,node3,node4);
88+
edge15 = Edge(11,node3,node7);
89+
edge16 = Edge(9,node4,node7);
90+
91+
edge17 = Edge(1,node1,node2);
92+
edge18 = Edge(1,node2,node3);
93+
edge19 = Edge(-3,node3,node1);
94+
95+
node1.adjacenciesList.append(edge1);
96+
node1.adjacenciesList.append(edge2);
97+
node1.adjacenciesList.append(edge3);
98+
node2.adjacenciesList.append(edge4);
99+
node2.adjacenciesList.append(edge5);
100+
node2.adjacenciesList.append(edge6);
101+
node8.adjacenciesList.append(edge7);
102+
node8.adjacenciesList.append(edge8);
103+
node5.adjacenciesList.append(edge9);
104+
node5.adjacenciesList.append(edge10);
105+
node5.adjacenciesList.append(edge11);
106+
node6.adjacenciesList.append(edge12);
107+
node6.adjacenciesList.append(edge13);
108+
node3.adjacenciesList.append(edge14);
109+
node3.adjacenciesList.append(edge15);
110+
node4.adjacenciesList.append(edge16);
111+
112+
113+
vertexList = (node1,node2,node3, node4, node5, node6, node7, node8);
114+
#edgeList = (edge1,edge2,edge3,edge4,edge5,edge6,edge7,edge8,edge9,edge10,edge11,edge12,edge13,edge14,edge15,edge16);
115+
edgeList = (edge17, edge18, edge19);
116+
117+
algorithm = BellmanFord();
118+
algorithm.calculateShortestPath(vertexList, edgeList, node1);
119+
algorithm.getShortestPathTo(node7);

0 commit comments

Comments
 (0)