From c8bba8f4513b668cd93a1ff9d105a6eff9bba77d Mon Sep 17 00:00:00 2001 From: Meysam Azad Date: Thu, 17 Sep 2020 14:57:38 +0430 Subject: [PATCH 1/7] test/graphs/kruskal: adding a test case to verify the correctness of the algorithm Fixes #2128 --- graphs/minimum_spanning_tree_kruskal.py | 33 ++++++++++--------- .../tests/test_min_spanning_tree_kruskal.py | 32 ++++++++++++++++++ 2 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 graphs/tests/test_min_spanning_tree_kruskal.py diff --git a/graphs/minimum_spanning_tree_kruskal.py b/graphs/minimum_spanning_tree_kruskal.py index 91b44f6508e7..3c7cc99590c5 100644 --- a/graphs/minimum_spanning_tree_kruskal.py +++ b/graphs/minimum_spanning_tree_kruskal.py @@ -1,13 +1,5 @@ -if __name__ == "__main__": - num_nodes, num_edges = list(map(int, input().strip().split())) - - edges = [] - - for i in range(num_edges): - node1, node2, cost = list(map(int, input().strip().split())) - edges.append((i, node1, node2, cost)) - - edges = sorted(edges, key=lambda edge: edge[3]) +def run_algorithm(num_nodes, num_edges, edges): + edges = sorted(edges, key=lambda edge: edge[2]) parent = list(range(num_nodes)) @@ -20,13 +12,22 @@ def find_parent(i): minimum_spanning_tree = [] for edge in edges: - parent_a = find_parent(edge[1]) - parent_b = find_parent(edge[2]) + parent_a = find_parent(edge[0]) + parent_b = find_parent(edge[1]) if parent_a != parent_b: - minimum_spanning_tree_cost += edge[3] + minimum_spanning_tree_cost += edge[2] minimum_spanning_tree.append(edge) parent[parent_a] = parent_b - print(minimum_spanning_tree_cost) - for edge in minimum_spanning_tree: - print(edge) + return minimum_spanning_tree + + +if __name__ == "__main__": # pragma: no cover + num_nodes, num_edges = list(map(int, input().strip().split())) + edges = [] + + for _ in range(num_edges): + node1, node2, cost = list(map(int, input().strip().split())) + edges.append((node1, node2, cost)) + + run_algorithm(num_nodes, num_edges, edges) diff --git a/graphs/tests/test_min_spanning_tree_kruskal.py b/graphs/tests/test_min_spanning_tree_kruskal.py new file mode 100644 index 000000000000..e90bd4ee6964 --- /dev/null +++ b/graphs/tests/test_min_spanning_tree_kruskal.py @@ -0,0 +1,32 @@ +from graphs.minimum_spanning_tree_kruskal import run_algorithm as kruskal + + +def test_kruskal_successful_result(): + num_nodes, num_edges = 9, 14 + edges = [[0, 1, 4], + [0, 7, 8], + [1, 2, 8], + [7, 8, 7], + [7, 6, 1], + [2, 8, 2], + [8, 6, 6], + [2, 3, 7], + [2, 5, 4], + [6, 5, 2], + [3, 5, 14], + [3, 4, 9], + [5, 4, 10], + [1, 7, 11]] + + result = kruskal(num_nodes, num_edges, edges) + + expected = [[7, 6, 1], + [2, 8, 2], + [6, 5, 2], + [0, 1, 4], + [2, 5, 4], + [2, 3, 7], + [0, 7, 8], + [3, 4, 9]] + + assert sorted(expected) == sorted(result) From e2c958f9391b116929f59623ccdbbe8c3db27bf7 Mon Sep 17 00:00:00 2001 From: Meysam Azad Date: Fri, 18 Sep 2020 14:44:08 +0430 Subject: [PATCH 2/7] grahps/kruskal: running psf/black --- .../tests/test_min_spanning_tree_kruskal.py | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/graphs/tests/test_min_spanning_tree_kruskal.py b/graphs/tests/test_min_spanning_tree_kruskal.py index e90bd4ee6964..4b86c4b3fd9d 100644 --- a/graphs/tests/test_min_spanning_tree_kruskal.py +++ b/graphs/tests/test_min_spanning_tree_kruskal.py @@ -3,30 +3,34 @@ def test_kruskal_successful_result(): num_nodes, num_edges = 9, 14 - edges = [[0, 1, 4], - [0, 7, 8], - [1, 2, 8], - [7, 8, 7], - [7, 6, 1], - [2, 8, 2], - [8, 6, 6], - [2, 3, 7], - [2, 5, 4], - [6, 5, 2], - [3, 5, 14], - [3, 4, 9], - [5, 4, 10], - [1, 7, 11]] + edges = [ + [0, 1, 4], + [0, 7, 8], + [1, 2, 8], + [7, 8, 7], + [7, 6, 1], + [2, 8, 2], + [8, 6, 6], + [2, 3, 7], + [2, 5, 4], + [6, 5, 2], + [3, 5, 14], + [3, 4, 9], + [5, 4, 10], + [1, 7, 11], + ] result = kruskal(num_nodes, num_edges, edges) - expected = [[7, 6, 1], - [2, 8, 2], - [6, 5, 2], - [0, 1, 4], - [2, 5, 4], - [2, 3, 7], - [0, 7, 8], - [3, 4, 9]] + expected = [ + [7, 6, 1], + [2, 8, 2], + [6, 5, 2], + [0, 1, 4], + [2, 5, 4], + [2, 3, 7], + [0, 7, 8], + [3, 4, 9], + ] assert sorted(expected) == sorted(result) From 4d3fb7e71a616b33ae518de1d349f4b5c9313033 Mon Sep 17 00:00:00 2001 From: Meysam Date: Fri, 18 Sep 2020 14:46:11 +0430 Subject: [PATCH 3/7] graphs/kruskal: read edges in a friendlier fashion Co-authored-by: Christian Clauss --- graphs/minimum_spanning_tree_kruskal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphs/minimum_spanning_tree_kruskal.py b/graphs/minimum_spanning_tree_kruskal.py index 3c7cc99590c5..ed11ace30e5d 100644 --- a/graphs/minimum_spanning_tree_kruskal.py +++ b/graphs/minimum_spanning_tree_kruskal.py @@ -27,7 +27,7 @@ def find_parent(i): edges = [] for _ in range(num_edges): - node1, node2, cost = list(map(int, input().strip().split())) + node1, node2, cost = [int(x) for x in input().strip().split()] edges.append((node1, node2, cost)) run_algorithm(num_nodes, num_edges, edges) From 6ca51e4f645dcbcdf0d6e23fe2b62e9a6ed036d8 Mon Sep 17 00:00:00 2001 From: John Law Date: Thu, 8 Oct 2020 19:57:37 +0800 Subject: [PATCH 4/7] Update minimum_spanning_tree_kruskal.py --- graphs/minimum_spanning_tree_kruskal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphs/minimum_spanning_tree_kruskal.py b/graphs/minimum_spanning_tree_kruskal.py index ed11ace30e5d..610baf4b5fe6 100644 --- a/graphs/minimum_spanning_tree_kruskal.py +++ b/graphs/minimum_spanning_tree_kruskal.py @@ -1,4 +1,4 @@ -def run_algorithm(num_nodes, num_edges, edges): +def kruskal(num_nodes, num_edges, edges): edges = sorted(edges, key=lambda edge: edge[2]) parent = list(range(num_nodes)) @@ -30,4 +30,4 @@ def find_parent(i): node1, node2, cost = [int(x) for x in input().strip().split()] edges.append((node1, node2, cost)) - run_algorithm(num_nodes, num_edges, edges) + kruskal(num_nodes, num_edges, edges) From 06d69bb6d6792430233975a7fe23e2c0826b5354 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Thu, 8 Oct 2020 11:58:17 +0000 Subject: [PATCH 5/7] fixup! Format Python code with psf/black push --- searches/simple_binary_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searches/simple_binary_search.py b/searches/simple_binary_search.py index 1d898e2d9ee0..b6215312fb2d 100644 --- a/searches/simple_binary_search.py +++ b/searches/simple_binary_search.py @@ -42,7 +42,7 @@ def binary_search(a_list: List[int], item: int) -> bool: if item < a_list[midpoint]: return binary_search(a_list[:midpoint], item) else: - return binary_search(a_list[midpoint + 1:], item) + return binary_search(a_list[midpoint + 1 :], item) if __name__ == "__main__": From 07e9514bdff5a9d572e333e3eb23141e999229ab Mon Sep 17 00:00:00 2001 From: John Law Date: Thu, 8 Oct 2020 20:06:08 +0800 Subject: [PATCH 6/7] Update test_min_spanning_tree_kruskal.py --- graphs/tests/test_min_spanning_tree_kruskal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphs/tests/test_min_spanning_tree_kruskal.py b/graphs/tests/test_min_spanning_tree_kruskal.py index 4b86c4b3fd9d..3a527aef384f 100644 --- a/graphs/tests/test_min_spanning_tree_kruskal.py +++ b/graphs/tests/test_min_spanning_tree_kruskal.py @@ -1,4 +1,4 @@ -from graphs.minimum_spanning_tree_kruskal import run_algorithm as kruskal +from graphs.minimum_spanning_tree_kruskal import kruskal def test_kruskal_successful_result(): From 9a119cfc750cce67e1ec8dc1a4d2194d6a11f655 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Thu, 8 Oct 2020 12:06:40 +0000 Subject: [PATCH 7/7] updating DIRECTORY.md --- DIRECTORY.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index 1dceb887940c..2b50f76995a6 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -141,6 +141,7 @@ * [Circular Queue](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/circular_queue.py) * [Double Ended Queue](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/double_ended_queue.py) * [Linked Queue](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/linked_queue.py) + * [Priority Queue Using List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/priority_queue_using_list.py) * [Queue On List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/queue_on_list.py) * [Queue On Pseudo Stack](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/queue_on_pseudo_stack.py) * Stacks @@ -285,6 +286,8 @@ * [Scc Kosaraju](https://github.com/TheAlgorithms/Python/blob/master/graphs/scc_kosaraju.py) * [Strongly Connected Components](https://github.com/TheAlgorithms/Python/blob/master/graphs/strongly_connected_components.py) * [Tarjans Scc](https://github.com/TheAlgorithms/Python/blob/master/graphs/tarjans_scc.py) + * Tests + * [Test Min Spanning Tree Kruskal](https://github.com/TheAlgorithms/Python/blob/master/graphs/tests/test_min_spanning_tree_kruskal.py) ## Greedy Method * [Greedy Knapsack](https://github.com/TheAlgorithms/Python/blob/master/greedy_method/greedy_knapsack.py) @@ -655,7 +658,7 @@ * [Linear Search](https://github.com/TheAlgorithms/Python/blob/master/searches/linear_search.py) * [Quick Select](https://github.com/TheAlgorithms/Python/blob/master/searches/quick_select.py) * [Sentinel Linear Search](https://github.com/TheAlgorithms/Python/blob/master/searches/sentinel_linear_search.py) - * [Simple-Binary-Search](https://github.com/TheAlgorithms/Python/blob/master/searches/simple-binary-search.py) + * [Simple Binary Search](https://github.com/TheAlgorithms/Python/blob/master/searches/simple_binary_search.py) * [Simulated Annealing](https://github.com/TheAlgorithms/Python/blob/master/searches/simulated_annealing.py) * [Tabu Search](https://github.com/TheAlgorithms/Python/blob/master/searches/tabu_search.py) * [Ternary Search](https://github.com/TheAlgorithms/Python/blob/master/searches/ternary_search.py)