Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Подскажите идеи по задаче D
1
  1  Нигматуллин Нияз Габдуллазянович [СПбГУ ИТМО], 12 октября 2009 г. 13:01:11
      о сделать нужно посчитать кол-во различных способов таких, что ни один цикл не лежит на пути из v -> i и v -> j.
Мы уже посчитали B(i) - это кол-во путей таких, что на пути v -> i, нет вершин через которые проходит цикл.
Давайте перемножим B(i) * B(j). Но теперь заметим что в B(i) мы посчитали такие способы, когда поддерево, в котором лежит j, это кактус, здесь мы посчитаем те случаи, когда есть цикл на пути из v -> j.
То же самое для B(j). Причем еще не только это, также для любых других e, когда есть ребро из v -> e и e не является предком v, когда поддерево с корнем в вершине e это кактус, мы также посчитали дважды в B(i) и B(j).
Тогда мы сделаем так, B(i) * B(j) / N(v). так как N(v) это произведение всех таких G(e) когда, то есть e это кактус. Тогда получится что G(i) и G(j) мы вообще не считали, а все остальные G(e) мы посчитали только один раз.
Добавляем это к ответу.
G(v) += B(i) * B(j) / N(v).
Так как ответ может быть большой, нужно было использовать длинную арифметику, и я не знаю, можно ли это сдать полностью на языке отличном от Java.
Ну чтобы ускорить алгоритм, разумно было хранить граф в списке смежности, так как всего V - 1 ребро.
Сложность алгоритма O(N ^ 3).
  2  Нигматуллин Нияз Габдуллазянович [СПбГУ ИТМО], 12 октября 2009 г. 13:00:33
      Разбор задачи Кактусы:
Задача будет решаться методом динамического программирования на дереве.
Для начала в поиске в глубину для каждой вершины посчитаем и положим в массив его родителя и для каждой пары вершин посчитаем еще одно число.
Для пары вершин (u; v) где u является предком v, f(u, v) = i, где путь из u -> v начинается с ребра (u, i), а u не является предком v, f(u, v) = -1.
Следующая часть, это динамика: тоже обходом в глубину, и будет считаться рекурсивно.
Рекурсивная функция будет возвращать кол-во кактусов, которые можно построить в поддереве с корнем в вершине v, назовем эту функцию G(v).
Для начала посчитаем кол-во кактусов таких, что через v не проходит ни одного цикла, то есть к вершине v не добавляется ребер.
Это произведение всех G(u), таких что существует ребро из v -> u и u не предок v. Назовем это N(v).
Прибавим к G(v) += N(v).
Теперь посчитаем кол-во таких случаев когда добавляется ребро из вершины v к его потомку.
Для всех u таких, что u является потомком v (или f(v, u) != -1) пройдем все вершины i, которые принадлежат кратчайшему пути из v -> u (включая сами v и u) и найдем произведение всех G(j), j смежно с i, и j не принадлежит пути из v -> u. Назовем это B(u).
Почему именно так: Мы посчитаем кол-во различных кактусов, причем в этих случаях до этого подкактусами могли только быть все поддеревья которые не пересекаются с путем из v -> u, иначе через какую нибудь вершину проходило бы два цикла, один через новое ребро, а другой через то которое добавили до этого.
Все такие B(u) которые посчитали здесь, мы добавим к G(v), не учитывая те, когда u является смежным с v,(либо f(v, u) != u) так как между ними ребро уже есть с самого начала.
Теперь посчитаем кол-во кактусов, когда мы добавляем ребро не к вершине v, но появляется цикл через вершину v. очевидно, что это ребро будет перекрестным.
Переберем все пары (i, j) где i и j являются потомками v, причем f(v, i) != f(v, j), это значит что v является наиближайшим общим предком, и попытаемся между i и j добавить ребро.
Ну чтобы эт
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru