from utils.graphs import edge_list, adjacency_list def visit(a_list, curr_v, visited): visited[curr_v - 1] = True for v in a_list[curr_v - 1]: if not visited[v - 1]: visit(a_list, v, visited) def count_components(edges, n): visited = [False] * v_count a_list = adjacency_list(edges, n) components_count = 0 while not all(visited): curr_v = visited.index(False) + 1 visit(a_list, curr_v, visited) components_count += 1 return components_count with open('graph.txt') as file: v_count, _, edge_list = edge_list(file) res = count_components(edge_list, v_count) print(res)
def test_adjacency_list(self): v_count, _, edges = edge_list(self.edge_list) expected_list = [[2], [1, 3, 4], [2, 4], [3, 2], []] actual_list = adjacency_list(edges, v_count) self.assertListEqual(expected_list, actual_list)
def test_degree_list(self): v_count, _, edges = edge_list(self.edge_list) actual_list = degree_list(edges, v_count) self.assertListEqual([1, 3, 2, 2, 0], actual_list)
def test_edge_list(self): expected_edges = [(1, 2), (2, 3), (4, 3), (2, 4)] v_count, e_count, edges = edge_list(self.edge_list) self.assertEqual(v_count, 5) self.assertEqual(e_count, 4) self.assertEqual(edges, expected_edges)
return d def adjacency_list(edges, n): a = [[] for _ in range(n)] for u, v in edges: a[u - 1].append(v) return a def breadth_first_search_queue(edges, n): a_list = adjacency_list(edges, n) visited = [True] + [False] * (n - 1) d = [0] + [-1] * (n - 1) q = [1] while q: curr_v = q.pop(0) for v in a_list[curr_v - 1]: if not visited[v - 1]: q.append(v) d[v - 1] = d[curr_v - 1] + 1 visited[v - 1] = True return d with open('graph.txt') as file, open('res.txt', 'w') as res_file: v_count, _, graph = edge_list(file) dist_list = breadth_first_search_queue(graph, v_count) res = ' '.join(map(str, dist_list)) res_file.write(res)
from utils.graphs import adjacency_list, degree_list, edge_list def double_degree_list(edges, n): d_list = degree_list(edges, n) a_list = adjacency_list(edges, n) return [sum(map(lambda v: d_list[v - 1], v_list)) for v_list in a_list] with open('graph.txt') as edges_file: v_count, _, graph = edge_list(edges_file) dd_list = double_degree_list(graph, v_count) print(*dd_list)