@@ -826,6 +826,7 @@ def all_pair_shortest_paths(graph: Graph, algorithm: str,
826
826
are implemented,
827
827
828
828
'floyd_warshall' -> Floyd Warshall algorithm as given in [1].
829
+ 'johnson' -> Johnson's Algorithm as given in [2]
829
830
backend: pydatastructs.Backend
830
831
The backend to be used.
831
832
Optional, by default, the best available
@@ -858,6 +859,7 @@ def all_pair_shortest_paths(graph: Graph, algorithm: str,
858
859
==========
859
860
860
861
.. [1] https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
862
+ .. [2] https://en.wikipedia.org/wiki/Johnson's_algorithm
861
863
"""
862
864
raise_if_backend_is_not_python (
863
865
all_pair_shortest_paths , kwargs .get ('backend' , Backend .PYTHON ))
@@ -901,49 +903,47 @@ def _floyd_warshall_adjacency_list(graph: Graph):
901
903
_floyd_warshall_adjacency_matrix = _floyd_warshall_adjacency_list
902
904
903
905
def _johnson_adjacency_list (graph : Graph ):
904
- new_vertex = AdjacencyListGraphNode ('q ' )
906
+ new_vertex = AdjacencyListGraphNode ('__q__ ' )
905
907
graph .add_vertex (new_vertex )
906
908
907
909
for vertex in graph .vertices :
908
- if vertex != 'q ' :
909
- graph .add_edge ('q ' ,vertex ,0 )
910
+ if vertex != '__q__ ' :
911
+ graph .add_edge ('__q__ ' ,vertex ,0 )
910
912
911
- distances , predecessors = shortest_paths (graph ,'bellman_ford' ,'q ' )
913
+ distances , predecessors = shortest_paths (graph ,'bellman_ford' ,'__q__ ' )
912
914
913
- edges_to_remove = []
915
+ edges_to_remove = []
914
916
for edge in graph .edge_weights :
915
- edge_node = graph .edge_weights [edge ]
916
- if edge_node .source .name == 'q ' :
917
+ edge_node = graph .edge_weights [edge ]
918
+ if edge_node .source .name == '__q__ ' :
917
919
edges_to_remove .append ((edge_node .source .name ,edge_node .target .name ))
918
920
919
921
for u ,v in edges_to_remove :
920
922
graph .remove_edge (u ,v )
921
- graph .remove_vertex ('q ' )
923
+ graph .remove_vertex ('__q__ ' )
922
924
923
925
for edge in graph .edge_weights :
924
- edge_node = graph .edge_weights [edge ]
925
- u ,v = edge_node .source .name ,edge_node .target .name
926
- graph .edge_weights [edge ].value += distances [u ]- distances [v ]
926
+ edge_node = graph .edge_weights [edge ]
927
+ u ,v = edge_node .source .name ,edge_node .target .name
928
+ graph .edge_weights [edge ].value += distances [u ]- distances [v ]
927
929
928
- print (graph .edge_weights )
929
- all_distances = {}
930
- all_next_vertex = {}
930
+ all_distances = {}
931
+ all_next_vertex = {}
931
932
932
933
for vertex in graph .vertices :
933
934
u = vertex
934
- dijkstra_dist ,dijkstra_pred = shortest_paths (graph , 'dijkstra' , u )
935
- print (dijkstra_pred )
936
- all_distances [u ]= {}
935
+ dijkstra_dist ,dijkstra_pred = shortest_paths (graph , 'dijkstra' , u )
936
+ all_distances [u ] = {}
937
937
all_next_vertex [u ] = {}
938
938
for v in graph .vertices :
939
- if dijkstra_pred [v ]== None or dijkstra_pred [v ]== u :
940
- all_next_vertex [u ][v ]= u
939
+ if dijkstra_pred [v ] is None or dijkstra_pred [v ] == u :
940
+ all_next_vertex [u ][v ] = u
941
941
else :
942
- all_next_vertex [u ][v ]= None
942
+ all_next_vertex [u ][v ] = None
943
943
if v in dijkstra_dist :
944
- all_distances [u ][v ]= dijkstra_dist [v ]- distances [u ]+ distances [v ]
944
+ all_distances [u ][v ] = dijkstra_dist [v ]- distances [u ]+ distances [v ]
945
945
else :
946
- all_distances [u ][v ]= float ('inf' )
946
+ all_distances [u ][v ] = float ('inf' )
947
947
948
948
return (all_distances ,all_next_vertex )
949
949
0 commit comments