has_cycle: есть ли ориентированный цикл в графе зависимостей
Напишите функцию has_cycle(n: int, edges: list[tuple[int, int]]) -> bool.
Вход. n — число вершин с номерами от 0 до n - 1. edges — список ориентированных рёбер: пара (u, v) означает ребро из u в v.
Выход. Ровно True или False (тип bool): содержит ли граф хотя бы один ориентированный цикл.
Поведение на краевых входах.
n = 0и пустой список рёбер — вернутьFalse.- Петля
(u, u)— это цикл длины 1, вернутьTrue. - Пара рёбер
(u, v)и(v, u)— цикл длины 2, вернутьTrue. - Два одинаковых ребра
(u, v)и(u, v)циклом не являются: направление у них одно и то же, вернутьFalse. - Ромб
0 -> 1,0 -> 2,1 -> 3,2 -> 3циклов не содержит: вершина 3 достигается двумя путями, но это не цикл.
Гарантируется, что все номера вершин лежат в диапазоне от 0 до n - 1.
заготовка решения
def has_cycle(n: int, edges: list[tuple[int, int]]) -> bool:
# ваш код
pass