def test_case_2(): vertex_to_name = {x: str(x + 1) for x in range(4)} edge_list = [ Edge(0, 2, -2), Edge(1, 0, 4), Edge(1, 2, 3), Edge(2, 3, 2), Edge(3, 1, -1) ] g = Graph(Graph.GRAPH_TYPE_DIRECTED_WEIGHT, vertex_to_name, edge_list) node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="LR") distances, paths = shortest_path_floyd_warshall(g) print("shortest path from and weight sum as:") for i in range(g.get_vertices_count()): for j in range(g.get_vertices_count()): path_str = "-".join( [g.get_vertex_name(vertex) for vertex in paths[i][j]]) print("%s to %s: %s%s %d" % (g.get_vertex_name(i), g.get_vertex_name(j), path_str, '*' * (15 - len(path_str)), distances[i][j]))
def test_case_1(): vertex_to_name = { 0: 'S', 1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G' } g = Graph(Graph.GRAPH_TYPE_UNDIRECTED, vertex_to_name, None) g.add_edges([ Edge(0, 1), Edge(0, 2), Edge(0, 3), Edge(1, 4), Edge(2, 5), Edge(3, 6), Edge(4, 7), Edge(5, 7), Edge(6, 7) ]) node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="LR") print('depth first traverse by iteration: ', [g.get_vertex_name(x) for x in depth_first_traverse_by_iteration(g)]) print('depth first traverse by recursion: ', [g.get_vertex_name(x) for x in depth_first_traverse_by_recursion(g)]) print('breadth first traverse: ', [g.get_vertex_name(x) for x in breadth_first_traverse(g)])
def test_case_1(): vertex_to_name = {x: str(x) for x in range(9)} edge_list = [ Edge(0, 1, 4), Edge(0, 7, 8), Edge(1, 2, 8), Edge(1, 7, 11), Edge(2, 3, 7), Edge(2, 5, 4), Edge(2, 8, 2), Edge(3, 4, 9), Edge(3, 5, 14), Edge(4, 5, 10), Edge(5, 6, 2), Edge(6, 7, 1), Edge(6, 8, 6), Edge(7, 8, 7) ] g = Graph(Graph.GRAPH_TYPE_UNDIRECTED_WEIGHT, vertex_to_name, edge_list) node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="LR") distances, paths = shortest_path_dijkstra(g, 1) print("shortest path from source and weight sum as:") for x in range(g.get_vertices_count()): path_str = "-".join([g.get_vertex_name(vertex) for vertex in paths[x]]) print("%s%s %i" % (path_str, '*' * (15 - len(path_str)), distances[x]))
def test_case_2(): vertex_to_name = {x: str(x) for x in range(4)} edge_list = [Edge(0, 1, 1), Edge(0, 2, 4), Edge(0, 3, 3), Edge(1, 3, 2), Edge(2, 3, 5)] g = Graph(Graph.GRAPH_TYPE_UNDIRECTED_WEIGHT, vertex_to_name, edge_list) node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="LR") weight_sum, edges = prim_algorithm(g) print('minimum span tree weight sum= ', weight_sum, ' select edges: ', edges)
def test_case_1(): dis_set = DisjointSet(4) dis_set.union(0, 1) dis_set.union(1, 2) dis_set.union(2, 3) dis_set.make_set(4) dis_set.union(1, 4) print(dis_set.parent, dis_set.rank) node_text_map, edges = dis_set.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=True, view_graph=True, rank_dir="TB")
def get_show_info(self): nodes_info = GraphVisualization.make_nodes({x: str(x) for x in range(len(self.parent))}) edges = [] for x in range(len(self.parent)): if self.parent[x] == x: edges.append((x, x, True)) else: while self.parent[x] != x: val = (self.parent[x], x, True) if val not in edges: edges.append(val) x = self.parent[x] edges_info = GraphVisualization.make_edges(edges) return nodes_info, edges_info
def test_case_2(): dis_set = DisjointSet(10) dis_set.union(3, 4) dis_set.union(8, 4) dis_set.union(9, 4) dis_set.union(0, 6) dis_set.union(1, 2) dis_set.union(7, 2) dis_set.union(2, 6) dis_set.union(5, 6) print('before is 7 8 in same set ?', dis_set.find(7) == dis_set.find(8)) dis_set.union(7, 3) print('after is 7 8 in same set ?', dis_set.find(7) == dis_set.find(8)) print(dis_set.parent, dis_set.rank) node_text_map, edges = dis_set.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=True, view_graph=True, rank_dir="TB")
def sort(data_array, order="Desc"): heap_type = (order == "Desc" and "min") or "max" # 建立堆方式1 从最后一个节点父节点开始 start_index = BinaryHeap.get_parent_index(len(data_array) - 1) for adjust_index in range(start_index, -1, -1): BinaryHeap.__move__down(heap_type, data_array, adjust_index) # 建立堆方式2 每个节点都向上调整 # for i in range(len(input_data)): # BinaryHeap.__move__up__(heap_type, input_data, i) bt = BinaryTree(data_array) node_text_map, edges = bt.get_show_info() GraphVisualization.show(node_text_map, edges, view_graph=True) # 依次与第i个元素交换 然后调整 for i in range(len(data_array)-1, 0, -1): data_array[i], data_array[0] = data_array[0], data_array[i] BinaryHeap.__move__down(heap_type, data_array, 0, i) return data_array
def get_show_info(self): def get_edge_label(edge): if self.graph_type == Graph.GRAPH_TYPE_DIRECTED_WEIGHT or \ self.graph_type == Graph.GRAPH_TYPE_UNDIRECTED_WEIGHT: return str( self.matrix[edge.from_vertex_index][edge.to_vertex_index]) else: return None nodes_info = GraphVisualization.make_nodes( {str(x): y for x, y in self.vertex_index_to_name.items()}) edges_info = GraphVisualization.make_edges([ (_edge.from_vertex_index, _edge.to_vertex_index, True, get_edge_label(_edge)) for _edge in self.get_all_edges() ]) is_directed = self.graph_type == Graph.GRAPH_TYPE_DIRECTED \ or self.graph_type == Graph.GRAPH_TYPE_DIRECTED_WEIGHT return nodes_info, edges_info, is_directed
def test_case_2(): # 森林的类型 vertex_to_name = { 0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'P', 7: 'Q', 8: 'R', 9: 'X', 10: 'Y', 11: 'Z' } g = Graph(Graph.GRAPH_TYPE_UNDIRECTED, vertex_to_name, None) g.add_edges([ Edge(0, 1), Edge(0, 3), Edge(1, 2), Edge(3, 4), Edge(3, 5), Edge(6, 7), Edge(6, 8), Edge(9, 10), Edge(10, 11) ]) node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="LR", description="Forest") print('depth first traverse by iteration: ', [g.get_vertex_name(x) for x in depth_first_traverse_by_iteration(g)]) print('depth first traverse by recursion: ', [g.get_vertex_name(x) for x in depth_first_traverse_by_recursion(g)]) print('breadth first traverse: ', [g.get_vertex_name(x) for x in breadth_first_traverse(g)])
def test_case_1(): vertex_to_name = {x: str(x + 1) for x in range(5)} edge_list = [ Edge(0, 1), Edge(0, 2), Edge(1, 2), Edge(1, 3), Edge(2, 3), Edge(2, 4) ] g = Graph(Graph.GRAPH_TYPE_DIRECTED, vertex_to_name, edge_list) node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="BT") print('one topological sort of by BFS is: ', [vertex_to_name[x] for x in topological_sort_by_bfs(g)]) print('one topological sort of by DFS is: ', [vertex_to_name[x] for x in topological_sort_by_dfs(g)])
vertex_to_name = { 0: 'S', 1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G' } g = Graph(Graph.GRAPH_TYPE_UNDIRECTED, vertex_to_name, None) g.add_edge(Edge(0, 1)) g.add_edge(Edge(0, 2)) g.add_edge(Edge(0, 3)) g.add_edge(Edge(1, 4)) g.add_edge(Edge(2, 5)) g.add_edge(Edge(3, 6)) g.add_edge(Edge(4, 7)) g.add_edge(Edge(5, 7)) g.add_edge(Edge(6, 7)) return g if __name__ == "__main__": g = make_graph_3() node_text_map, edges, directed = g.get_show_info() GraphVisualization.show(node_text_map, edges, is_directed=directed, view_graph=True, rank_dir="LR")