def test_can_add_multiple_edges_between_two_vertices(self): graph = UndirectedGraph() graph.add_edge(0, 1, 1) graph.add_edge(0, 1, 2) adjacency_list = graph.get_adjacency_list() self.assertEqual(2, len(adjacency_list)) self.assertEqual(2, len(adjacency_list[0])) self.assertListEqual([0, 0], sorted(map(lambda e: e.start, adjacency_list[0]))) self.assertListEqual([1, 1], sorted(map(lambda e: e.end, adjacency_list[0]))) self.assertListEqual([1, 2], sorted(map(lambda e: e.weight, adjacency_list[0]))) self.assertEqual(2, len(adjacency_list[1])) self.assertListEqual([1, 1], sorted(map(lambda e: e.start, adjacency_list[1]))) self.assertListEqual([0, 0], sorted(map(lambda e: e.end, adjacency_list[1]))) self.assertListEqual([1, 2], sorted(map(lambda e: e.weight, adjacency_list[1]))) edges = graph.get_edges() self.assertEqual(4, len(edges)) self.assertListEqual([0, 0, 1, 1], sorted(map(lambda e: e.start, edges))) self.assertListEqual([0, 0, 1, 1], sorted(map(lambda e: e.end, edges))) self.assertListEqual([1, 1, 2, 2], sorted(map(lambda e: e.weight, edges)))
def count_number_of_road_forks(field): """ Returns number of times you are able to move in more than one direction by a given forest :param field: Array of strings that represent forest :return: number of road forks """ graph = UndirectedGraph() start = None end = None height = len(field) width = len(field[0]) for i, row in enumerate(field): for j, symbol in enumerate(row): if symbol == 'X': continue index = __linear_index(i, j, width) if symbol == 'M': start = index if symbol == '*': end = index if __can_go_to(i - 1, j, height, width): if field[i - 1][j] != 'X': neighbor_index = __linear_index(i - 1, j, width) graph.add_edge(neighbor_index, index, 1) if __can_go_to(i, j - 1, height, width): if field[i][j - 1] != 'X': neighbor_index = __linear_index(i, j - 1, width) graph.add_edge(neighbor_index, index, 1) path = dijkstra_path(graph, start, end) fork_count = 1 if len(graph.get_edges(start)) > 1 else 0 for vertex in path[1:-1]: if len(graph.get_edges(vertex)) - 1 > 1: fork_count += 1 return fork_count
def test_adding_single_edge_produces_two_directed_edges(self): graph = UndirectedGraph() graph.add_edge(0, 1, 1) adjacency_list = graph.get_adjacency_list() self.assertEqual(2, len(adjacency_list)) self.assertEqual(1, len(adjacency_list[0])) self.assertEqual(0, adjacency_list[0][0].start) self.assertEqual(1, adjacency_list[0][0].end) self.assertEqual(1, adjacency_list[0][0].weight) self.assertEqual(1, len(adjacency_list[1])) self.assertEqual(1, adjacency_list[1][0].start) self.assertEqual(0, adjacency_list[1][0].end) self.assertEqual(1, adjacency_list[1][0].weight) edges = graph.get_edges() self.assertEqual(2, len(edges)) self.assertListEqual([0, 1], sorted(map(lambda e: e.start, edges))) self.assertListEqual([0, 1], sorted(map(lambda e: e.end, edges))) self.assertListEqual([1, 1], sorted(map(lambda e: e.weight, edges)))
def test_graph_is_empty_by_default(self): graph = UndirectedGraph() self.assertEqual(0, len(graph.get_adjacency_list())) self.assertEqual(0, len(graph.get_edges()))