diff --git a/src/DFS/DFS.py b/src/DFS/DFS.py new file mode 100644 index 0000000..6505e23 --- /dev/null +++ b/src/DFS/DFS.py @@ -0,0 +1,33 @@ +class Graph: + def __init__(self, vertices: list[int], edges: list[tuple[int, int]]) -> None: + self.vertices = vertices + self.edges = edges + self.ind = 0 + + def dfs_gen(self): + states = {"white": [v for v in self.vertices], "gray": list(), "black": list()} + visited_verteces = [] + + def dfs_step(vertex): + if vertex in states["white"]: + states["gray"].append(vertex) + states["white"].remove(vertex) + visited_verteces.append(vertex) + for edge in self.edges: + if edge[0] == vertex: + dfs_step(edge[1]) + if edge[1] == vertex: + dfs_step(edge[0]) + + for vertex in self.vertices: + dfs_step(vertex) + yield from visited_verteces + + def __iter__(self): + return self.dfs_gen() + + # realisation of dfs method that returns list of visited verteces (first subtask) + def dfs(self): + return list(self.dfs_gen()) + + diff --git a/src/DFS/DFS_test.py b/src/DFS/DFS_test.py new file mode 100644 index 0000000..5cf7127 --- /dev/null +++ b/src/DFS/DFS_test.py @@ -0,0 +1,40 @@ +from DFS import Graph + +def test_graph_iteration(): + g1 = Graph([0, 1, 2, 3, 4, 5, 6, 7], + [(0, 1), (0, 2), (0, 3), (1, 4), (1, 5), (2, 6), (3, 7)]) + g1l = list(g1) + correct_way = [0, 1, 4, 5, 2, 6, 3, 7] + assert correct_way == g1l + +def test_line_iteration(): + g2 = Graph([0, 1, 2, 3, 4], + [(0, 1), (1, 2), (3, 4)]) + g2l = list(g2) + correct_way = [0, 1, 2, 3, 4] + assert correct_way == g2l + +def test_single_vertex(): + g3 = Graph([0], + []) + g3l = list(g3) + assert g3l == [0] + +def test_zero_vertex(): + g4 = Graph([], + []) + g4l = list(g4) + assert g4l == [] + +def test_dfs(): + g5 = Graph([0, 1, 2, 3, 4, 5, 6, 7], + [(0, 1), (0, 2), (0, 3), (1, 4), (1, 5), (2, 6), (3, 7)]) + correct_way = [0, 1, 4, 5, 2, 6, 3, 7] + assert correct_way == g5.dfs() + + + + + + +