Блог пользователя BlackStar

Автор BlackStar, 13 лет назад, По-русски

Всем привет! Собственно вот задачка, подкиньте, пожалуйста, идею.

  • Проголосовать: нравится
  • -4
  • Проголосовать: не нравится

»
13 лет назад, скрыть # |
 
Проголосовать: нравится -16 Проголосовать: не нравится
  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится -6 Проголосовать: не нравится

    Спасибо. Не изучал еще такого алгоритма.

    • »
      »
      »
      13 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Omelianenko прав.

      LCA ищет наименьшего общего предка двух вершин. Топологическа сортировка для его постоения нужна (если это не Тарьян). В данной задаче ответ на запрос 1, только если вершины лежат в одной компоненте связности и LCA(a,b)=a, во всех других случаях ответ 0.

      За чушь собачью написаную мной в комменте ниже дико извиняюсь это была попытка решить задачу не думая.

»
13 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится +8 Проголосовать: не нравится

надо воспользоваться такой штукой "время входа-выхода в dfs". так как нам дан связный граф без циклов (деревце), то истинность данного условия (tin[u] < tin[v] && tout[u] > tout[v]) равносильна тому, что u предок v. вы слышали что-нибудь об этом, знаете, как считать tin[] и tout[]?

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Простой способ. Топологическая сортировка.

Запускаем dfs из корней деревьев. Запоминаем время выхода из каждой вершины. У кого время больше, тот и предок. Не забудьте покрасить вершины номерами компоненты связности в которых они лежат, а то могут сравниваться вершины с разных компонент, очевидно, что для них ответ 0.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Задача с qbit.org.ua Авторское решение предполагает топологическую сортировку графа.