def test_union_on_three_nodes_as_1_2_and_1_3(self): value1 = 1 value2 = 2 value3 = 3 node1 = union_find.Node(value1) node2 = union_find.Node(value2) node3 = union_find.Node(value3) self.structure.make_set(node1) self.structure.make_set(node2) self.structure.make_set(node3) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, node3, 0) self.structure.union(node1, node2) self.assert_node(node1, value1, node1, 1) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node3, 0) self.structure.union(node1, node3) self.assert_node(node1, value1, node1, 1) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 0)
def test_repr_with_parent_and_rank(self): parent = union_find.Node(1) node = union_find.Node(2) node.parent = parent node.rank = 123 self.assertEqual('[2, parent=1, rank=123]', repr(node))
def test_make_set_on_three_nodes(self): value1 = 1 value2 = 2 value3 = 3 node1 = union_find.Node(value1) node2 = union_find.Node(value2) node3 = union_find.Node(value3) self.structure.make_set(node1) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, None, None) self.assert_node(node3, value3, None, None) self.structure.make_set(node2) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, None, None) self.structure.make_set(node3) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, node3, 0)
def test_find_on_on_three_nodes(self): value1 = 1 value2 = 2 value3 = 3 node1 = union_find.Node(value1) node2 = union_find.Node(value2) node3 = union_find.Node(value3) self.structure.make_set(node1) self.structure.make_set(node2) self.structure.make_set(node3) result = self.structure.find(node1) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, node3, 0) result = self.structure.find(node2) self.assertEqual(node2, result) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, node3, 0) result = self.structure.find(node3) self.assertEqual(node3, result) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, node3, 0)
def test_union_on_two_nodes_before_make_set(self): value1 = 1 value2 = 2 node1 = union_find.Node(value1) node2 = union_find.Node(value2) with self.assertRaisesRegex(ValueError, '1 not in the set.'): self.structure.union(node1, node2) with self.assertRaisesRegex(ValueError, '2 not in the set.'): self.structure.union(node2, node1)
def test_find_on_four_node_set_of_two_ranks(self): value1 = 1 value2 = 2 value3 = 3 value4 = 4 node1 = union_find.Node(value1) node2 = union_find.Node(value2) node3 = union_find.Node(value3) node4 = union_find.Node(value4) self.structure.make_set(node1) self.structure.make_set(node2) self.structure.make_set(node3) self.structure.make_set(node4) self.structure.union(node1, node2) self.structure.union(node3, node4) self.structure.union(node1, node3) result = self.structure.find(node1) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 2) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) result = self.structure.find(node2) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 2) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) result = self.structure.find(node3) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 2) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) result = self.structure.find(node4) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 2) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node1, 0)
def test_make_set_on_two_nodes(self): value1 = 1 value2 = 2 node1 = union_find.Node(value1) node2 = union_find.Node(value2) self.structure.make_set(node1) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, None, None) self.structure.make_set(node2) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0)
def test_make_set_on_one_node(self): value = 1 node = union_find.Node(value) self.structure.make_set(node) self.assert_node(node, value, node, 0)
def test_constructor(self): value = 1 node = union_find.Node(value) self.assertEqual(value, node.value) self.assertEqual(None, node.parent) self.assertEqual(None, node.rank)
def test_find_on_one_node(self): value = 1 node = union_find.Node(value) self.structure.make_set(node) result = self.structure.find(node) self.assertEqual(node, result) self.assert_node(node, value, node, 0)
def test_union_on_four_nodes_as_1_2_and_3_4_and_1_3(self): value1 = 1 value2 = 2 value3 = 3 value4 = 4 node1 = union_find.Node(value1) node2 = union_find.Node(value2) node3 = union_find.Node(value3) node4 = union_find.Node(value4) self.structure.make_set(node1) self.structure.make_set(node2) self.structure.make_set(node3) self.structure.make_set(node4) self.assert_node(node1, value1, node1, 0) self.assert_node(node2, value2, node2, 0) self.assert_node(node3, value3, node3, 0) self.assert_node(node4, value4, node4, 0) self.structure.union(node1, node2) self.assert_node(node1, value1, node1, 1) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node3, 0) self.assert_node(node4, value4, node4, 0) self.structure.union(node3, node4) self.assert_node(node1, value1, node1, 1) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node3, 1) self.assert_node(node4, value4, node3, 0) self.structure.union(node1, node3) self.assert_node(node1, value1, node1, 2) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0)
def kruskal(self, graph): """ Given a connected undirected graph G = (V, E) with positive edge weights, computes a minimum spanning tree that consists of a subset of edges E′ ⊆ E of minimum total weight such that the graph (V, E′) is connected. Greedy Strategy: Repeatedly adds the next lightest edge if this doesn’t produce a cycle. Note: The graph does not have to be undirected. """ minimum_spanning_tree = Graph() set = union_find.UnionFind() node_to_wrapper_node_map = {} priority_queue = heap.BinHeap(heap.HeapMode.min) for node in graph.nodes(): minimum_spanning_tree.add_node(node) wrapper_node = union_find.Node(node) node_to_wrapper_node_map[node] = wrapper_node set.make_set(wrapper_node) for u, v in graph.edges(): edge = (node_to_wrapper_node_map[u], node_to_wrapper_node_map[v]) priority_queue.insert(heap.HeapItem(graph.weight((u, v)), edge)) while priority_queue.size > 0: min_item = priority_queue.extract() u_node, v_node = min_item.datum if set.find(u_node) != set.find(v_node): minimum_spanning_tree.add_undirected_edge( u_node.value, v_node.value, min_item.priority) set.union(u_node, v_node) return minimum_spanning_tree
def test_lt(self): node1 = union_find.Node(1) node2 = union_find.Node(2) self.assertEqual(True, node1 < node2) self.assertEqual(False, node2 < node1)
def test_eq(self): node1 = union_find.Node(1) node2 = union_find.Node(2) self.assertEqual(False, node1 == node2) self.assertEqual(False, node2 == node1)
def test_str(self): node = union_find.Node(1) self.assertEqual('1', str(node))
def test_gt_on_diff_type(self): node = union_find.Node(1) self.assertEqual(False, 'diff-type' > node) self.assertEqual(False, node > 'diff-type')
def test_gt_on_none(self): node = union_find.Node(1) self.assertEqual(False, None > node) self.assertEqual(False, node > None)
def test_eq_on_diff_type(self): node = union_find.Node(1) self.assertEqual(False, 'diff-type' == node) self.assertEqual(False, node == 'diff-type')
def test_find_on_eight_node_set_of_three_ranks(self): value1 = 1 value2 = 2 value3 = 3 value4 = 4 value5 = 5 value6 = 6 value7 = 7 value8 = 8 node1 = union_find.Node(value1) node2 = union_find.Node(value2) node3 = union_find.Node(value3) node4 = union_find.Node(value4) node5 = union_find.Node(value5) node6 = union_find.Node(value6) node7 = union_find.Node(value7) node8 = union_find.Node(value8) self.structure.make_set(node1) self.structure.make_set(node2) self.structure.make_set(node3) self.structure.make_set(node4) self.structure.make_set(node5) self.structure.make_set(node6) self.structure.make_set(node7) self.structure.make_set(node8) self.structure.union(node1, node2) self.structure.union(node3, node4) self.structure.union(node1, node3) self.structure.union(node5, node6) self.structure.union(node7, node8) self.structure.union(node5, node7) self.structure.union(node1, node5) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node5, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node1) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node5, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node2) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node5, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node3) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node3, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node5, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node4) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node1, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node5, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node5) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node1, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node5, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node6) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node1, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node1, 0) self.assert_node(node7, value7, node5, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node7) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node1, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node1, 0) self.assert_node(node7, value7, node1, 1) self.assert_node(node8, value8, node7, 0) result = self.structure.find(node8) self.assertEqual(node1, result) self.assert_node(node1, value1, node1, 3) self.assert_node(node2, value2, node1, 0) self.assert_node(node3, value3, node1, 1) self.assert_node(node4, value4, node1, 0) self.assert_node(node5, value5, node1, 2) self.assert_node(node6, value6, node1, 0) self.assert_node(node7, value7, node1, 1) self.assert_node(node8, value8, node1, 0)
def test_eq_on_none(self): node = union_find.Node(1) self.assertEqual(False, None == node) self.assertEqual(False, node == None)
def test_lt_on_none(self): node = union_find.Node(1) self.assertEqual(False, None < node) self.assertEqual(False, node < None)
def test_gt_on_self(self): node = union_find.Node(1) self.assertEqual(False, node > node)
def test_eq_on_self(self): node = union_find.Node(1) self.assertEqual(True, node == node)
def test_repr(self): node = union_find.Node(1) self.assertEqual('[1, parent=None, rank=None]', repr(node))
def test_find_before_make_set(self): node = union_find.Node(1) with self.assertRaisesRegex(ValueError, '1 not in the set.'): self.structure.find(node)