SlideShare a Scribd company logo
1 of 11
Download to read offline
Задача 8 – Магические порталы
1. Найдём компоненты сильной связности графа в порядке
топологической сортировки и построим конденсацию графа.
1
2
3
45
12
3
4
5
С1 С3
С1 С2
С3
С2
Алгоритм поиска компонентов сильной связности*
1). Запустить серию обходов в глубину исходного графа , которая
возвращает вершины в порядке увеличения времени выхода tout, т.е.
некоторый список order.
2). Построить транспонированный граф.
3). Запустить серию обходов в глубину транспонированного графа в
порядке, определяемом списком (т.е. в порядке уменьшения времени
выхода).
Каждое множество вершин, достигнутое в результате очередного
запуска обхода, и будет очередной компонентой сильной связности.
Компоненты автоматически получаются в порядке топологической
сортировки
http://e-maxx.ru/algo/strong_connected_components
Пусть c1, c2, … – размеры компонент С1, C2, …
Начальное количество совершенных городов равно c1.
Это количество может увеличиться только при развороте ребра,
начинающегося в C1 и заканчивающегося в Ci , где i > 1.
- Частный случай: i = 2, в компонентах C1 и C2 по одной вершине.
Компоненты «меняются ролями», остаётся одна совершенная
вершина
- Общий случай: i≠2 или в компоненте С1 или С2 более одной
вершины.
Совершенными стали все вершины в компонентах от 1 до i-й.
Их количество = c1 + c2 + … + ci
Число вариантов рёбер = c1 × ci, т.к. из каждой вершины из С1 идет
ребро в каждую вершину из Сi.
12
3
4
5
С1
С2
С3
Решение подзадач 1 - 3
Решение подзадачи 4
Число совершенных вершин может уменьшиться только при развороте
ребра, начало и конец которого лежат в C1
Исходный граф является турниром (существует ровно одно
ориентированное ребро между любыми двумя вершинами).
Тогда и компонента C1 тоже будет турниром.
Известно, что в любом полносвязном турнире существует
гамильтонов цикл (теорема Редеи - Камиона).
Нужно его найти.
12
3
4
5
С1
С2
С3
Построение гамильтонова цикла для решения подзадачи 4 *
Доказательство теоремы Редеи – Камионаявляется конструктивным –
то есть, по сути, даёт алгоритм поиска гамильтонова цикла.
Основные этапы:
1. Строим цикл длины 3
2. На каждом шаге цикл длины k превращаем в цикл длины (k + 1)
Этап 1. Как построить цикл длины 3? Берём любую вершину u. Всегда
найдутся такие вершины w2, w1, что u–w2–w1–u - цикл.
Этап 2. Возможны два отдельных случая. Рассмотрим их подробнее…
Увеличение цикла длины k до длины (k + 1)
Первый случай – найдётся такая вершина v0, что существует входящее
в неё ребро из какой-то вершины цикла и, аналогично, исходящее.
Тогда найдутся и две соседних вершины в цикле, такие что из одной
ребро выходит в v0, а в другую входит.
Второй случай
http://neerc.ifmo.ru/wiki/index.php?title=Теорема_Редеи-Камиона
Структуры данных, позволяющие получить сложность O(n2) *
- Целочисленный массив cycle[n] – список вершин цикла
- Булевский массив c[n] – множество вершин цикла
- Булевский массив v1[n] – множество вершин, не принадлежащих
циклу, из которых выходят рёбра в вершины цикла
- Булевский массив v2[n] – множество вершин, не принадлежащих
циклу, в которые приходят рёбра из вершин цикла
- Целочисленный массив from_v2[n]. Здесь from_v2[i] – это количество
дуг, которые приходят в вершину i из вершин из множества v2.
После каждого увеличения цикла все массивы обновляются
* Вполне возможны и другие эффективные реализации
Решение подзадачи 4 - продолжение
1 2 3 4
1 2 3 4
Как видим, на рисунке только три вершины остались совершенными.
Как находить их количество?...
Решение подзадачи 4 – продолжение
Подсчёт числа совершенных вершин
при удалении ребра из последней вершины в первую
1 2 3 4
Решение подзадачи 4 – окончание
Вернём удалённое ребро на место.
Сдвинем первую вершину на место правее последней.
12 3 4
Перенумеруем вершины, чтобы номера снова шли слева направо:
41 2 3
Заметим, что массив x не нужно считать заново за квадрат, а можно
получить из предыдущего с линейной сложностью. Для этого:
1. Сдвигаем элементы в x на единицу влево и вычитаем из них 1
2. Перебираем ребра, выходящие из новой последней вершины, и
при необходимости обновляем значения в x.
Делаем такие сдвиги столько раз, чтобы каждая вершина
гамильтонова цикла побывала на последнем месте

More Related Content

Similar to Разбор задач областного этапа всероссийской олимпиады школьников по информатике 2015г. II тур. Часть 2

Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"DEVTYPE
 
Элементы дискретной математики для программистов
Элементы дискретной математики для программистовЭлементы дискретной математики для программистов
Элементы дискретной математики для программистовDEVTYPE
 
6. Теория графов ll
6. Теория графов ll6. Теория графов ll
6. Теория графов llDEVTYPE
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеAndrey Dolinin
 
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИАПрезентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА2berkas
 
Основы комбинаторики II. Разбор задач
Основы комбинаторики II. Разбор задачОсновы комбинаторики II. Разбор задач
Основы комбинаторики II. Разбор задачDEVTYPE
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс2berkas
 
алгоритм циклический
алгоритм циклическийалгоритм циклический
алгоритм циклическийKhydosilova
 

Similar to Разбор задач областного этапа всероссийской олимпиады школьников по информатике 2015г. II тур. Часть 2 (15)

Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Элементы дискретной математики для программистов
Элементы дискретной математики для программистовЭлементы дискретной математики для программистов
Элементы дискретной математики для программистов
 
6. Теория графов ll
6. Теория графов ll6. Теория графов ll
6. Теория графов ll
 
4 algoritm
4 algoritm4 algoritm
4 algoritm
 
Алгоритм
АлгоритмАлгоритм
Алгоритм
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция Повторение
 
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИАПрезентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА
 
Основы комбинаторики II. Разбор задач
Основы комбинаторики II. Разбор задачОсновы комбинаторики II. Разбор задач
Основы комбинаторики II. Разбор задач
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
8 2-4-3
8 2-4-38 2-4-3
8 2-4-3
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
 
алгоритм циклический
алгоритм циклическийалгоритм циклический
алгоритм циклический
 
5
55
5
 
циклы
циклыциклы
циклы
 
лекция 6
лекция 6лекция 6
лекция 6
 

More from Олег Стрекаловский

Когда код «убивает», или зачем нам тестировать наши продукты
Когда код «убивает», или зачем  нам тестировать наши продуктыКогда код «убивает», или зачем  нам тестировать наши продукты
Когда код «убивает», или зачем нам тестировать наши продуктыОлег Стрекаловский
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Олег Стрекаловский
 
"Тёмная и Светлая сторона убеждения людей"
"Тёмная и Светлая сторона убеждения людей""Тёмная и Светлая сторона убеждения людей"
"Тёмная и Светлая сторона убеждения людей"Олег Стрекаловский
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Олег Стрекаловский
 

More from Олег Стрекаловский (7)

Analysis day2
Analysis day2Analysis day2
Analysis day2
 
Analysis day1 - 2016
Analysis day1 - 2016Analysis day1 - 2016
Analysis day1 - 2016
 
Защита моей ВКР.
Защита моей ВКР.Защита моей ВКР.
Защита моей ВКР.
 
Когда код «убивает», или зачем нам тестировать наши продукты
Когда код «убивает», или зачем  нам тестировать наши продуктыКогда код «убивает», или зачем  нам тестировать наши продукты
Когда код «убивает», или зачем нам тестировать наши продукты
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 
"Тёмная и Светлая сторона убеждения людей"
"Тёмная и Светлая сторона убеждения людей""Тёмная и Светлая сторона убеждения людей"
"Тёмная и Светлая сторона убеждения людей"
 
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...Разбор задач областного этапа всероссийской олимпиады школьников по информати...
Разбор задач областного этапа всероссийской олимпиады школьников по информати...
 

Разбор задач областного этапа всероссийской олимпиады школьников по информатике 2015г. II тур. Часть 2

  • 1. Задача 8 – Магические порталы
  • 2. 1. Найдём компоненты сильной связности графа в порядке топологической сортировки и построим конденсацию графа. 1 2 3 45 12 3 4 5 С1 С3 С1 С2 С3 С2
  • 3. Алгоритм поиска компонентов сильной связности* 1). Запустить серию обходов в глубину исходного графа , которая возвращает вершины в порядке увеличения времени выхода tout, т.е. некоторый список order. 2). Построить транспонированный граф. 3). Запустить серию обходов в глубину транспонированного графа в порядке, определяемом списком (т.е. в порядке уменьшения времени выхода). Каждое множество вершин, достигнутое в результате очередного запуска обхода, и будет очередной компонентой сильной связности. Компоненты автоматически получаются в порядке топологической сортировки http://e-maxx.ru/algo/strong_connected_components
  • 4. Пусть c1, c2, … – размеры компонент С1, C2, … Начальное количество совершенных городов равно c1. Это количество может увеличиться только при развороте ребра, начинающегося в C1 и заканчивающегося в Ci , где i > 1. - Частный случай: i = 2, в компонентах C1 и C2 по одной вершине. Компоненты «меняются ролями», остаётся одна совершенная вершина - Общий случай: i≠2 или в компоненте С1 или С2 более одной вершины. Совершенными стали все вершины в компонентах от 1 до i-й. Их количество = c1 + c2 + … + ci Число вариантов рёбер = c1 × ci, т.к. из каждой вершины из С1 идет ребро в каждую вершину из Сi. 12 3 4 5 С1 С2 С3 Решение подзадач 1 - 3
  • 5. Решение подзадачи 4 Число совершенных вершин может уменьшиться только при развороте ребра, начало и конец которого лежат в C1 Исходный граф является турниром (существует ровно одно ориентированное ребро между любыми двумя вершинами). Тогда и компонента C1 тоже будет турниром. Известно, что в любом полносвязном турнире существует гамильтонов цикл (теорема Редеи - Камиона). Нужно его найти. 12 3 4 5 С1 С2 С3
  • 6. Построение гамильтонова цикла для решения подзадачи 4 * Доказательство теоремы Редеи – Камионаявляется конструктивным – то есть, по сути, даёт алгоритм поиска гамильтонова цикла. Основные этапы: 1. Строим цикл длины 3 2. На каждом шаге цикл длины k превращаем в цикл длины (k + 1) Этап 1. Как построить цикл длины 3? Берём любую вершину u. Всегда найдутся такие вершины w2, w1, что u–w2–w1–u - цикл. Этап 2. Возможны два отдельных случая. Рассмотрим их подробнее…
  • 7. Увеличение цикла длины k до длины (k + 1) Первый случай – найдётся такая вершина v0, что существует входящее в неё ребро из какой-то вершины цикла и, аналогично, исходящее. Тогда найдутся и две соседних вершины в цикле, такие что из одной ребро выходит в v0, а в другую входит. Второй случай http://neerc.ifmo.ru/wiki/index.php?title=Теорема_Редеи-Камиона
  • 8. Структуры данных, позволяющие получить сложность O(n2) * - Целочисленный массив cycle[n] – список вершин цикла - Булевский массив c[n] – множество вершин цикла - Булевский массив v1[n] – множество вершин, не принадлежащих циклу, из которых выходят рёбра в вершины цикла - Булевский массив v2[n] – множество вершин, не принадлежащих циклу, в которые приходят рёбра из вершин цикла - Целочисленный массив from_v2[n]. Здесь from_v2[i] – это количество дуг, которые приходят в вершину i из вершин из множества v2. После каждого увеличения цикла все массивы обновляются * Вполне возможны и другие эффективные реализации
  • 9. Решение подзадачи 4 - продолжение 1 2 3 4 1 2 3 4 Как видим, на рисунке только три вершины остались совершенными. Как находить их количество?...
  • 10. Решение подзадачи 4 – продолжение Подсчёт числа совершенных вершин при удалении ребра из последней вершины в первую 1 2 3 4
  • 11. Решение подзадачи 4 – окончание Вернём удалённое ребро на место. Сдвинем первую вершину на место правее последней. 12 3 4 Перенумеруем вершины, чтобы номера снова шли слева направо: 41 2 3 Заметим, что массив x не нужно считать заново за квадрат, а можно получить из предыдущего с линейной сложностью. Для этого: 1. Сдвигаем элементы в x на единицу влево и вычитаем из них 1 2. Перебираем ребра, выходящие из новой последней вершины, и при необходимости обновляем значения в x. Делаем такие сдвиги столько раз, чтобы каждая вершина гамильтонова цикла побывала на последнем месте