Для решения задачи определения циклов в ориентированном графе можно использовать алгоритм поиска в глубину (DFS). Если во время выполнения DFS мы обнаружим ребро, которое ведет к вершине, которую мы уже посещали и которая находится в стеке рекурсии, это означает, что найден цикл.
код на Python для решения этой задачи:
def find_cycle(n, edges):
from sys import setrecursionlimit, stdin, stdout
import threading
setrecursionlimit(100000)
threading.stack_size(2**26)
def dfs(v):
nonlocal cycle_start, cycle_end
visited[v] = 1
stack[v] = 1
for to in adj[v]:
if visited[to] == 0:
parent[to] = v
if dfs(to):
return True
elif stack[to] == 1:
cycle_end = v
cycle_start = to
return True
stack[v] = 0
return False
def solve():
nonlocal cycle_start, cycle_end
input = stdin.read
data = input().split()
n = int(data[0])
m = int(data[1])
adj = [[] for _ in range(n + 1)]
index = 2
for _ in range(m):
u = int(data[index])
v = int(data[index + 1])
adj[u].append(v)
index += 2
visited = [0] * (n + 1)
stack = [0] * (n + 1)
parent = [-1] * (n + 1)
cycle_start = -1
cycle_end = -1
for v in range(1, n + 1):
if visited[v] == 0:
if dfs(v):
break
if cycle_start == -1:
print("NO")
else:
print("YES")
cycle = []
cycle.append(cycle_start)
v = cycle_end
while v != cycle_start:
cycle.append(v)
v = parent[v]
cycle.append(cycle_start)
cycle.reverse()
print(" ".join(map(str, cycle)))
threading.Thread(target=solve).start()
# Example usage:
# You can provide the input directly to the standard input (stdin) or use input redirection from a file.
import sys
from io import StringIO
input_data = """3 3
1 2
2 3
3 1
"""
sys.stdin = StringIO(input_data)
find_cycle(3, 3)
Дан ориентированный невзвешенный граф. Необходимо определить, есть ли в нём циклы, и если есть, то вывести любой из них.
Входные данные
В первой строке входного файла находятся два натуральных числа n
и m
(1≤n≤100000,m≤100000
) — количество вершин и рёбер в графе соответственно. Далее в m
строках перечислены рёбра графа. Каждое ребро задаётся парой чисел — номерами начальной и конечной вершин соответственно.
Выходные данные
Если в графе нет цикла, то вывести «NO», иначе — «YES» и затем перечислить все вершины в порядке обхода цикла.
Пример
входные данные
3 3
1 2
2 3
3 1
выходные данные
YES
2 3 1l