fork download
  1. class Graph:
  2. def __init__(self, vertices):
  3. self.vertices = vertices
  4. self.graph = {}
  5.  
  6. def add_edge(self, u, v):
  7. if u not in self.graph:
  8. self.graph[u] = []
  9. self.graph[u].append(v)
  10.  
  11. def is_cyclic_util(self, v, visited, rec_stack):
  12. visited[v] = True
  13. rec_stack[v] = True
  14.  
  15. if v in self.graph:
  16. for neighbor in self.graph[v]:
  17. if not visited[neighbor]:
  18. if self.is_cyclic_util(neighbor, visited, rec_stack):
  19. return True
  20. elif rec_stack[neighbor]:
  21. return True
  22.  
  23. rec_stack[v] = False
  24. return False
  25.  
  26. def is_cyclic(self):
  27. visited = {v: False for v in range(self.vertices)}
  28. rec_stack = {v: False for v in range(self.vertices)}
  29.  
  30. for vertex in range(self.vertices):
  31. if not visited[vertex]:
  32. if self.is_cyclic_util(vertex, visited, rec_stack):
  33. return True
  34.  
  35. return False
  36.  
  37.  
  38. # Приклад використання
  39. if __name__ == "__main__":
  40. # Створення графа та додавання ребер
  41. g = Graph(4)
  42. g.add_edge(0, 1)
  43. g.add_edge(0, 2)
  44. g.add_edge(1, 2)
  45. g.add_edge(2, 0)
  46. g.add_edge(2, 3)
  47. g.add_edge(3, 3)
  48.  
  49. # Перевірка, чи є граф ациклічним
  50. if g.is_cyclic():
  51. print("Граф містить цикли.")
  52. else:
  53. print("Граф є ациклічним.")
  54.  
Success #stdin #stdout 0.03s 25684KB
stdin
Standard input is empty
stdout
class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.graph = {}

    def add_edge(self, u, v):
        if u not in self.graph:
            self.graph[u] = []
        self.graph[u].append(v)

    def is_cyclic_util(self, v, visited, rec_stack):
        visited[v] = True
        rec_stack[v] = True

        if v in self.graph:
            for neighbor in self.graph[v]:
                if not visited[neighbor]:
                    if self.is_cyclic_util(neighbor, visited, rec_stack):
                        return True
                elif rec_stack[neighbor]:
                    return True

        rec_stack[v] = False
        return False

    def is_cyclic(self):
        visited = {v: False for v in range(self.vertices)}
        rec_stack = {v: False for v in range(self.vertices)}

        for vertex in range(self.vertices):
            if not visited[vertex]:
                if self.is_cyclic_util(vertex, visited, rec_stack):
                    return True

        return False


# Приклад використання
if __name__ == "__main__":
    # Створення графа та додавання ребер
    g = Graph(4)
    g.add_edge(0, 1)
    g.add_edge(0, 2)
    g.add_edge(1, 2)
    g.add_edge(2, 0)
    g.add_edge(2, 3)
    g.add_edge(3, 3)

    # Перевірка, чи є граф ациклічним
    if g.is_cyclic():
        print("Граф містить цикли.")
    else:
        print("Граф є ациклічним.")