|
| 1 | +class Graph: |
| 2 | + # Constructor |
| 3 | + def __init__(self, num_of_nodes, directed=True): |
| 4 | + self.m_num_of_nodes = num_of_nodes |
| 5 | + self.m_nodes = range(self.m_num_of_nodes) |
| 6 | + |
| 7 | + # Directed or Undirected |
| 8 | + self.m_directed = directed |
| 9 | + |
| 10 | + # Graph representation - Adjacency list |
| 11 | + # We use a dictionary to implement an adjacency list |
| 12 | + self.m_adj_list = {node: set() for node in self.m_nodes} |
| 13 | + |
| 14 | + # Add edge to the graph |
| 15 | + def add_edge(self, node1, node2, weight=1): |
| 16 | + self.m_adj_list[node1].add((node2, weight)) |
| 17 | + |
| 18 | + if not self.m_directed: |
| 19 | + self.m_adj_list[node2].add((node1, weight)) |
| 20 | + |
| 21 | + # Print the graph representation |
| 22 | + def print_adj_list(self): |
| 23 | + for key in self.m_adj_list.keys(): |
| 24 | + print("node", key, ": ", self.m_adj_list[key]) |
| 25 | + |
| 26 | + def dfs(self, start, target, path = [], visited = set()): |
| 27 | + path.append(start) |
| 28 | + visited.add(start) |
| 29 | + if start == target: |
| 30 | + return path |
| 31 | + for (neighbour, weight) in self.m_adj_list[start]: |
| 32 | + if neighbour not in visited: |
| 33 | + result = self.dfs(neighbour, target, path, visited) |
| 34 | + if result is not None: |
| 35 | + return result |
| 36 | + path.pop() |
| 37 | + return None |
| 38 | + |
| 39 | +def main(): |
| 40 | + graph = Graph(5, directed=False) |
| 41 | + |
| 42 | + graph.add_edge(0, 1) |
| 43 | + graph.add_edge(0, 2) |
| 44 | + graph.add_edge(1, 3) |
| 45 | + graph.add_edge(2, 3) |
| 46 | + graph.add_edge(3, 4) |
| 47 | + |
| 48 | + graph.print_adj_list() |
| 49 | + |
| 50 | + traversal_path = [] |
| 51 | + traversal_path = graph.dfs(0, 3) |
| 52 | + print(traversal_path) |
| 53 | + |
| 54 | +if __name__=="__main__": |
| 55 | + main() |
0 commit comments