4
4
Edge = namedtuple ('Edge' , ['vertex' , 'weight' ])
5
5
6
6
7
- class GraphWeighted (object ):
7
+ class GraphUndirectedWeighted (object ):
8
8
def __init__ (self , vertex_count ):
9
9
self .vertex_count = vertex_count
10
10
self .adjacency_list = [[] for _ in range (vertex_count )]
@@ -13,6 +13,7 @@ def add_edge(self, source, dest, weight):
13
13
assert source < self .vertex_count
14
14
assert dest < self .vertex_count
15
15
self .adjacency_list [source ].append (Edge (dest , weight ))
16
+ self .adjacency_list [dest ].append (Edge (source , weight ))
16
17
17
18
def get_edge (self , vertex ):
18
19
for e in self .adjacency_list [vertex ]:
@@ -47,6 +48,9 @@ def dijkstra(graph, source, dest):
47
48
if distances [e .vertex ] > candidate_distance :
48
49
distances [e .vertex ] = candidate_distance
49
50
parents [e .vertex ] = v
51
+ # primitive but effective negative cycle detection
52
+ if candidate_distance < - 1000 :
53
+ raise Exception ("Negative cycle detected" )
50
54
q .put (([distances [e .vertex ], e .vertex ]))
51
55
52
56
shortest_path = []
@@ -61,31 +65,22 @@ def dijkstra(graph, source, dest):
61
65
62
66
63
67
def main ():
64
- g = GraphWeighted (9 )
68
+ g = GraphUndirectedWeighted (9 )
65
69
g .add_edge (0 , 1 , 4 )
66
70
g .add_edge (1 , 7 , 6 )
67
71
g .add_edge (1 , 2 , 1 )
68
- g .add_edge (1 , 0 , 4 )
69
- g .add_edge (2 , 1 , 1 )
70
72
g .add_edge (2 , 3 , 3 )
71
- g .add_edge (3 , 2 , 3 )
72
73
g .add_edge (3 , 7 , 1 )
73
74
g .add_edge (3 , 4 , 2 )
74
75
g .add_edge (3 , 5 , 1 )
75
- g .add_edge (4 , 3 , 2 )
76
76
g .add_edge (4 , 5 , 1 )
77
- g .add_edge (5 , 4 , 1 )
78
- g .add_edge (5 , 3 , 1 )
79
77
g .add_edge (5 , 6 , 1 )
80
- g .add_edge (6 , 5 , 1 )
81
78
g .add_edge (6 , 7 , 2 )
82
79
g .add_edge (6 , 8 , 2 )
83
- g .add_edge (7 , 1 , 6 )
84
- g .add_edge (7 , 3 , 1 )
85
- g .add_edge (7 , 6 , 2 )
86
80
g .add_edge (7 , 8 , 2 )
87
- g .add_edge (8 , 7 , 2 )
88
- g .add_edge (8 , 6 , 2 )
81
+ # for testing negative cycles
82
+ # g.add_edge(1, 9, -5)
83
+ # g.add_edge(9, 7, -4)
89
84
90
85
shortest_path , distance = dijkstra (g , 0 , 1 )
91
86
assert shortest_path == [0 , 1 ] and distance == 4
0 commit comments