def FloydWarshall_itr(a_graph, k, subsol_kminus1): num_of_vertices = a_graph.num_vertices subsol_k = DenseMatrix(num_of_vertices, num_of_vertices) for vertex_a_id in a_graph.vertex_dic: for vertex_b_id in a_graph.vertex_dic: path_ab_kminus1_cost = subsol_kminus1.read_val(vertex_a_id, vertex_b_id) path_akb_cost = subsol_kminus1.read_val(vertex_a_id, k) + subsol_kminus1.read_val(k, vertex_b_id) path_ab_k_cost = min(path_ab_kminus1_cost, path_akb_cost) subsol_k.set_val(vertex_a_id, vertex_b_id, path_ab_k_cost) return subsol_k
def FloydWarshall(a_graph): num_of_vertices = a_graph.num_vertices #Initialize the subsolution of the shortest paths between every pair of vertices in G that contains 0 internal vertices subsol_0 = DenseMatrix(num_of_vertices, num_of_vertices) for vertex_a_id in a_graph.vertex_dic: for vertex_b_id in a_graph.vertex_dic: if vertex_a_id == vertex_b_id: subsol_0.set_val(vertex_a_id, vertex_b_id, 0) else: edge_ab = a_graph.find_edge(vertex_a_id, vertex_b_id) if edge_ab != None: subsol_0.set_val(vertex_a_id, vertex_b_id, edge_ab.edge_cost) else: subsol_0.set_val(vertex_a_id, vertex_b_id, float('inf')) subsol_k = subsol_0 #Iteratively, using the subsolution of the shortest paths between every pair of vertices in G that contains only v1, v2, ... vk-1, #find the subsolution of the shortest paths between very pair of vertices in G that contains only v1, v2, ... vk-1, vk for k in range(1, len(a_graph.vertex_dic)): subsol_kminus1 = subsol_k subsol_k = FloydWarshall_itr(a_graph, k, subsol_kminus1) print(k) return subsol_k