Advertisement
nq1s788

Untitled

Dec 22nd, 2024
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.39 KB | None | 0 0
  1. Будем говорить, что мы "входим в вершину", когда впервые заходим в нее dfs-ом, а "выходим из вершины", когда обошли всё ее поддерево (запустили dfs от всех ее детей), то есть закончили dfs в ней. Заметим, что если x родитель y, тогда сначала мы зайдем в x, потом зайдем в y, потом выйдем из y, потом выйдем из x. Только в таком порядке, потому что y (вместе со своим поддеревом) лежит в поддереве x. Если же ни x ни y не является родителем другого, тогда мы сначала обойдем поддерево одного, потом другого, те: зайдем в x, выйдем из x, зайдем в y, выйдем из y.
  2.  
  3. Получается, что для того чтобы проверять, является ли x родителем y, нам достаточно знать порядок входов и выходов в x и y.
  4.  
  5. Для того чтобы быстро проверять этот порядок, давайте во время обхода dfs-ом для каждой вершины сохранять, каким по счету было это событие входа или выхода. Это называется время входа (tin) и время выхода (tout).
  6.  
  7. Тогда на запрос можно будет ответить за О(1) -- x родитель y, если tin[x] < tin[y] and tout[y] < tout[x].
  8.  
  9. Пример кода на python:
  10. def dfs(h):
  11.     global time
  12.     tin[h] = time
  13.     time += 1
  14.     for e in g[h]:
  15.         dfs(e)
  16.     tout[h] = time
  17.     time += 1
  18.  
  19.  
  20. n = int(input())
  21. g = [[] for i in range(n)] #set чтобы убрать повторы
  22. inp = list(map(int, input().split()))
  23. for i in range(n):
  24.     if inp[i] == 0:
  25.         continue
  26.     g[inp[i] - 1].append(i)
  27. tin = [0] * n
  28. tout = [0] * n
  29. time = 0
  30. for i in range(n):
  31.     if inp[i] == 0: #запускаемся из корней
  32.         dfs(i)
  33. m = int(input())
  34. for i in range(m):
  35.     x, y = map(int, input().split())
  36.     x -= 1
  37.     y -= 1
  38.     if tin[x] < tin[y] and tout[y] < tout[x]:
  39.         print(1)
  40.     else:
  41.         print(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement