<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=176.59.22.229&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=176.59.22.229&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/176.59.22.229"/>
		<updated>2026-05-19T16:38:20Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=59557</id>
		<title>Примеры сведения к задачам поиска потока</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=59557"/>
				<updated>2017-01-10T20:00:20Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.22.229: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Рассмотрим несколько задач, которые решаются путём сведения к задаче о поиске максимального потока в сети.&lt;br /&gt;
&lt;br /&gt;
== Пример №1. Лабиринт Минотавра ==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано поле размером &amp;lt;tex&amp;gt;N \times M&amp;lt;/tex&amp;gt;, некоторые клетки поля закрашены. В одной из незакрашенных клеток поля стоит Минотавр, он умеет ходить только по незакрашенным клеткам (из текущей клетки он может пойти только в ту клетку, с которой имеет общую сторону). Какое минимальное количество клеток нужно закрасить, чтобы Минотавр не смог выбраться за пределы поля?&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#if: {{{neat|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fcfcfc; float:left;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #ddd;&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: #ddd&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; background-color: #fcfcfc; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
[[Файл:Monster.png|Пример поля]] [[Файл:MonsterSolution.png|Решение текущего примера]]&lt;br /&gt;
&lt;br /&gt;
Сразу скажем, что выбраться за пределы поля эквивалентно тому, что Минотавр может дойти до какой-либо крайней клетки.&lt;br /&gt;
&lt;br /&gt;
=== Решение и доказательство корректности ===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Минимальное количество клеток, которое нужно закрасить, равно максимальному количеству клеточно-непересекающихся путей из позиции Минотавра до крайних клеток поля.&lt;br /&gt;
|proof=&lt;br /&gt;
Очевидно, что ответ не больше, чем количество всех путей от Минотавра до крайних клеток. Сделаем ещё более строгое неравенство: ответ не больше, чем максимальное количество клеточно-непересекающихся путей, т.к. если взять какие-нибудь &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; пересекающихся пути и закрасить клетку в позиции, где они пересекаются, то блокируется выход за пределы поля сразу по &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; этим путям. С другой стороны, если закрасить клетку на каком-то из путей, то блокируется только этот путь, т.к. были взяты клеточно-непересекающиеся пути. Значит, ответ не меньше, чем количество таких путей.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Переход к сети ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[Определение сети, потока#flow_network|сеть]], в которой вершинам будут соответствовать незакрашенные клетки поля, соседние незакрашенные клетки соединим ориентированными рёбрами с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. В качестве истока возьмём вершину, которой соответствует клетка Минотавр. Добавим в граф ещё одну вершину — сток, добавим рёбра из вершин, соответствующим крайним клеткам поля, в сток с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Чтобы пути не пересекались по клеткам, раздвоим каждую вершину графа на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; вершины: в одну будут только входить рёбра, из другой — только выходить рёбра, и сами эти вершины соединим ребром с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Dublicate2.png|center]]&lt;br /&gt;
&lt;br /&gt;
Используя [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину|алгоритм Форда-Фалкерсона]], найдём максимальный поток в сети. Согласно [[Теорема о декомпозиции|теореме о декомпозиции]], нахождение максимального потока эквивалентно тому, что мы нашли максимальное количество путей из истока в сток. Т.е. требуемый ответ на задачу равен максимальному потоку. &lt;br /&gt;
&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма Форда-Фалкерсона &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;. Первое замечание: &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leqslant&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leqslant&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4NM&amp;lt;/tex&amp;gt; (это следует из того, что из каждой вершины исходит не более &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; рёбер), т.е. &amp;lt;tex&amp;gt;E=O(NM)&amp;lt;/tex&amp;gt;. Второе замечание: ответ не превосходит &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, т.к. можно закрасить клетку слева, справа, сверху и снизу от позиции Минотавра и он не сможет никуда двигаться, поэтому &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; можно считать константой. Итоговое время работы &amp;lt;tex&amp;gt;O(NM)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;br /&gt;
&lt;br /&gt;
==Пример №2. Испорченный паркет.==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дан паркет размером &amp;lt;tex&amp;gt;N \times M&amp;lt;/tex&amp;gt;, некоторые клетки которого испорчены, их необходимо закрыть новыми плитками. Плитки бывают размером &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; ценой &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;1 \times 1&amp;lt;/tex&amp;gt; ценой &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. Плитки можно поворачивать, но нельзя разрезать. Какую минимальную сумму нужно потратить, что бы заложить испорченные плитки паркета. Новые плитки не должны перекрывать никакие другие плитки.&lt;br /&gt;
}}&lt;br /&gt;
===Решение===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto;&amp;quot;&lt;br /&gt;
| [[Файл:Parquet_example_1.png|thumb|400px|Пример паркета]]&lt;br /&gt;
| [[Файл:Parquet_example_2.png|thumb|400px|Пример раскраски]]&lt;br /&gt;
|}&lt;br /&gt;
Сначала проверим, что &amp;lt;tex&amp;gt;2 \times B&amp;gt;A&amp;lt;/tex&amp;gt;. Если это условие не выполнено, то все выгодней замостить только плитками &amp;lt;tex&amp;gt;1 \times 1&amp;lt;/tex&amp;gt; и больше нечего считать. Теперь на нужно максимизировать количество плиток ценой &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Раскрасим наш паркет по принципу шахматной доски, тогда один конец плитки &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; будет лежать на черной клетке, другой – на белой. Итак, построим двудольный граф, одна доля которого будет содержать белые клетки, другая – черные. Ребра весом в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; проведем между граничащими клетками. Добавим исток с ребрами в белые вершины весом в бесконечность и сток с ребрами из черных клеток весом тоже в бесконечность. Пускай &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; – величина найденного максимального потока между истоком и стоком, это и будет количество плиток &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt;. Ответом к задаче будет величина &amp;lt;tex&amp;gt;f \times A+(K-f) \times B&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; – общее число испорченных клеток.&lt;br /&gt;
===Доказательство корректности===&lt;br /&gt;
Заметим следующее: мы ищем максимальное паросочетание в двудольном графе. Это означает, что белая вершина будет соединена не более чем с одной чёрной и наоборот – это именно то, что нам нужно, ведь соединяя чёрную клетку с белой, мы понимаем, что можем разместить здесь плитку размером &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; и она не будет ни с чем пересекаться. Теперь мы ищем максимальное число таких рёбер. Это всё происходит также, как и в сведении задачи поиска максимального паросочетания к задаче о нахождении максимального потока.&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Величину максимального потока можно искать с помощью алгоритма Форда-Фалкерсона, его время работы &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; – величина найденного максимального потока. Заметим, что &amp;lt;tex&amp;gt;|f| \leqslant  \dfrac K 2&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; – общее число испорченных клеток. Также заметим, что &amp;lt;tex&amp;gt;E \leqslant K \times 4&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; рёбер исходят из истока и входят в сток и максимум &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; ребра могут исходить из вершины в левой доле в правую. Из всего этого следует, что итоговое время работы будет &amp;lt;tex&amp;gt;O(K^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
==Пример №3. Коллекционер монет.==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=Есть &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; коллекционеров и &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; видов монет. Для вступления в клуб, необходимо иметь не меньше одной монеты каждого типа. Вы (у вас номер 1) можете меняться с коллекционерами имеющимися монетами. Любой коллекционер обменяет монету свою монету &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; на вашу монету &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, если у него '''больше''' одной монеты типа &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и нету ни одной монеты типа &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Вы, в свою очередь, можете нарушать это правило. Нужно набрать как можно больше типов монет по известной ситуации у всех коллекционеров.&lt;br /&gt;
}}&lt;br /&gt;
===Решение===&lt;br /&gt;
[[Файл:Coints_task.gif|400px|thumb|right|Жёлтые вершины – монеты разных типов, синие – коллекционеры. Красное ребро означает, что коллекционеру нужна монета этого типа, причём пропускная способнасть этого ребра равна 1, зелёное – что у него больше одной монеты данного типа]]&lt;br /&gt;
Построим сеть следующего вида: создадим для каждого типа монет по одной вершине, эти вершины будут соответствовать вашим монетам. Нужно собрать как можно больше уникальных монет, поэтому проведем ребро пропускной способности &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; в сток из каждой такой вершины. В вершины, соответствующие монетам, которые у Вас есть изначально, проведем ребро, пропускная способность которого равна количеству таких монет у вас. Для каждого члена клуба (кроме вас) заведем по одной вершине. Эта вершина может принимать не более одной монеты, которой у него нет и отдавать не более &amp;lt;tex&amp;gt;k-1&amp;lt;/tex&amp;gt; монеты, которых у него &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(k &amp;gt; 1)&amp;lt;/tex&amp;gt;. Естественно, член клуба отдает одну монету взамен одной полученной. Таким образом, в каждую такую вершину нужно провести ребро пропускной способности &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; из вершин соответствующих монетам, которых нет у этого члена клуба. А из этих вершин нужно провести ребра пропускной способностью &amp;lt;tex&amp;gt;k_i - 1&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, соответствующую монетам, которых у члена клуба больше одной. Построенная сеть отражает процессы обмена в клубе. Максимальный поток в такой сети будет равен максимальному количеству монет, которые могуть быть собраны вами.&lt;br /&gt;
===Доказательство корректности===&lt;br /&gt;
Как уже было сказано, построенная сеть отражает процессы обмена в клубе, пример можно посмотреть на картинке выше. Заметим следующее: &lt;br /&gt;
* из вершины каждого типа монет может выйти поток, величина которого &amp;lt;tex&amp;gt;\leqslant 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
* в вершины каждого типа монет может войти поток, величина которого не больше количества монет данного типа&lt;br /&gt;
* если коллекционеру нужна эта монета и мы решили дать её, то мы дадим максимум одну монету этого типа, т.к. пропускная способность красного ребра &amp;lt;tex&amp;gt;= 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* если в данную вершину пришёл поток данной величины, то мы должны отдать из этой вершины поток такой же величины. (Из определения потока)&lt;br /&gt;
Всё вышесказанное подтверждает то, что построенная сеть корректно отображает процессы обмена монетами между участниками.    &lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Величину максимального потока можно искать с помощью алгоритма Форда-Фалкерсона, его время работы &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; – величина найденного максимального потока. Заметим, что &amp;lt;tex&amp;gt;|f| \leqslant M&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; – количество типов монет. Также заметим, что &amp;lt;tex&amp;gt;E = M \times 2 + E^*&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E^*&amp;lt;/tex&amp;gt; – общее минимальное число монет, которые нужно получить все коллекционерам (кроме вас), чтобы вступить в клуб &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; сумма типов монет, которых больше &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, по всем коллекционерам. Из всего этого следует, что итоговое время работы будет &amp;lt;tex&amp;gt;O(ME)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[Схема алгоритма Диница]]&lt;br /&gt;
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]&lt;br /&gt;
* [[Алгоритм масштабирования потока]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://icpc.baylor.edu/regionals/finder/west-siberian-subregional-2016 The 2016 West Siberian Subregional Contest]&lt;br /&gt;
* [https://www.dropbox.com/s/o24szu3mj341wig/WPS2009.pdf?dl=0 Зимняя школа по программированию, Харьков 2009 ]&lt;br /&gt;
* [http://codeforces.com/blog/entry/19068?locale=ru Codeforces лекции Зимней Школы по Программированию]&lt;/div&gt;</summary>
		<author><name>176.59.22.229</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=59556</id>
		<title>Примеры сведения к задачам поиска потока</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=59556"/>
				<updated>2017-01-10T19:59:40Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.22.229: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Рассмотрим несколько задач, которые решаются путём сведения к задаче о поиске максимального потока в сети.&lt;br /&gt;
&lt;br /&gt;
== Пример №1. Лабиринт Минотавра ==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано поле размером &amp;lt;tex&amp;gt;N \times M&amp;lt;/tex&amp;gt;, некоторые клетки поля закрашены. В одной из незакрашенных клеток поля стоит Минотавр, он умеет ходить только по незакрашенным клеткам (из текущей клетки он может пойти только в ту клетку, с которой имеет общую сторону). Какое минимальное количество клеток нужно закрасить, чтобы Минотавр не смог выбраться за пределы поля?&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#if: {{{neat|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fcfcfc; float:left;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #ddd;&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: #ddd&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; background-color: #fcfcfc; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
[[Файл:Monster.png|Пример поля]] [[Файл:MonsterSolution.png|Решение текущего примера]]&lt;br /&gt;
&lt;br /&gt;
Сразу скажем, что выбраться за пределы поля эквивалентно тому, что Минотавр может дойти до какой-либо крайней клетки.&lt;br /&gt;
&lt;br /&gt;
=== Решение и доказательство корректности ===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Минимальное количество клеток, которое нужно закрасить, равно максимальному количеству клеточно-непересекающихся путей из позиции Минотавра до крайних клеток поля.&lt;br /&gt;
|proof=&lt;br /&gt;
Очевидно, что ответ не больше, чем количество всех путей от Минотавра до крайних клеток. Сделаем ещё более строгое неравенство: ответ не больше, чем максимальное количество клеточно-непересекающихся путей, т.к. если взять какие-нибудь &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; пересекающихся пути и закрасить клетку в позиции, где они пересекаются, то блокируется выход за пределы поля сразу по &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; этим путям. С другой стороны, если закрасить клетку на каком-то из путей, то блокируется только этот путь, т.к. были взяты клеточно-непересекающиеся пути. Значит, ответ не меньше, чем количество таких путей.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Переход к сети ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[Определение сети, потока#flow_network|сеть]], в которой вершинам будут соответствовать незакрашенные клетки поля, соседние незакрашенные клетки соединим ориентированными рёбрами с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. В качестве истока возьмём вершину, которой соответствует клетка Минотавр. Добавим в граф ещё одну вершину — сток, добавим рёбра из вершин, соответствующим крайним клеткам поля, в сток с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Чтобы пути не пересекались по клеткам, раздвоим каждую вершину графа на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; вершины: в одну будут только входить рёбра, из другой — только выходить рёбра, и сами эти вершины соединим ребром с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Dublicate2.png|center]]&lt;br /&gt;
&lt;br /&gt;
Используя [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину|алгоритм Форда-Фалкерсона]], найдём максимальный поток в сети. Согласно [[Теорема о декомпозиции|теореме о декомпозиции]], нахождение максимального потока эквивалентно тому, что мы нашли максимальное количество путей из истока в сток. Т.е. требуемый ответ на задачу равен максимальному потоку. &lt;br /&gt;
&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма Форда-Фалкерсона &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;. Первое замечание: &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leqslant&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leqslant&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4NM&amp;lt;/tex&amp;gt; (это следует из того, что из каждой вершины исходит не более &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; рёбер), т.е. &amp;lt;tex&amp;gt;E=O(NM)&amp;lt;/tex&amp;gt;. Второе замечание: ответ не превосходит &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, т.к. можно закрасить клетку слева, справа, сверху и снизу от позиции Минотавра и он не сможет никуда двигаться, поэтому &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; можно считать константой. Итоговое время работы &amp;lt;tex&amp;gt;O(NM)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;br /&gt;
&lt;br /&gt;
==Пример №2. Испорченный паркет.==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дан паркет размером &amp;lt;tex&amp;gt;N \times M&amp;lt;/tex&amp;gt;, некоторые клетки которого испорчены, их необходимо закрыть новыми плитками. Плитки бывают размером &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; ценой &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;1 \times 1&amp;lt;/tex&amp;gt; ценой &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. Плитки можно поворачивать, но нельзя разрезать. Какую минимальную сумму нужно потратить, что бы заложить испорченные плитки паркета. Новые плитки не должны перекрывать никакие другие плитки.&lt;br /&gt;
}}&lt;br /&gt;
===Решение===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto;&amp;quot;&lt;br /&gt;
| [[Файл:Parquet_example_1.png|thumb|400px|Пример паркета]]&lt;br /&gt;
| [[Файл:Parquet_example_2.png|thumb|400px|Пример раскраски]]&lt;br /&gt;
|}&lt;br /&gt;
Сначала проверим, что &amp;lt;tex&amp;gt;2 \times B&amp;gt;A&amp;lt;/tex&amp;gt;. Если это условие не выполнено, то все выгодней замостить только плитками &amp;lt;tex&amp;gt;1 \times 1&amp;lt;/tex&amp;gt; и больше нечего считать. Теперь на нужно максимизировать количество плиток ценой &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Раскрасим наш паркет по принципу шахматной доски, тогда один конец плитки &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; будет лежать на черной клетке, другой – на белой. Итак, построим двудольный граф, одна доля которого будет содержать белые клетки, другая – черные. Ребра весом в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; проведем между граничащими клетками. Добавим исток с ребрами в белые вершины весом в бесконечность и сток с ребрами из черных клеток весом тоже в бесконечность. Пускай &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; – величина найденного максимального потока между истоком и стоком, это и будет количество плиток &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt;. Ответом к задаче будет величина &amp;lt;tex&amp;gt;f \times A+(K-f) \times B&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; – общее число испорченных клеток.&lt;br /&gt;
===Доказательство корректности===&lt;br /&gt;
Заметим следующее: по сути мы ищем максимальное паросочетание в двудольном графе. Это означает, что белая вершина будет соединена не более чем с одной чёрной и наоборот – это именно то, что нам нужно, ведь соединяя чёрную клетку с белой, мы понимаем, что можем разместить здесь плитку размером &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; и она не будет ни с чем пересекаться. Теперь мы ищем максимальное число таких рёбер. Это всё происходит также, как и в сведении задачи поиска максимального паросочетания к задаче о нахождении максимального потока.&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Величину максимального потока можно искать с помощью алгоритма Форда-Фалкерсона, его время работы &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; – величина найденного максимального потока. Заметим, что &amp;lt;tex&amp;gt;|f| \leqslant  \dfrac K 2&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; – общее число испорченных клеток. Также заметим, что &amp;lt;tex&amp;gt;E \leqslant K \times 4&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; рёбер исходят из истока и входят в сток и максимум &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; ребра могут исходить из вершины в левой доле в правую. Из всего этого следует, что итоговое время работы будет &amp;lt;tex&amp;gt;O(K^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
==Пример №3. Коллекционер монет.==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=Есть &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; коллекционеров и &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; видов монет. Для вступления в клуб, необходимо иметь не меньше одной монеты каждого типа. Вы (у вас номер 1) можете меняться с коллекционерами имеющимися монетами. Любой коллекционер обменяет монету свою монету &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; на вашу монету &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, если у него '''больше''' одной монеты типа &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и нету ни одной монеты типа &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Вы, в свою очередь, можете нарушать это правило. Нужно набрать как можно больше типов монет по известной ситуации у всех коллекционеров.&lt;br /&gt;
}}&lt;br /&gt;
===Решение===&lt;br /&gt;
[[Файл:Coints_task.gif|400px|thumb|right|Жёлтые вершины – монеты разных типов, синие – коллекционеры. Красное ребро означает, что коллекционеру нужна монета этого типа, причём пропускная способнасть этого ребра равна 1, зелёное – что у него больше одной монеты данного типа]]&lt;br /&gt;
Построим сеть следующего вида: создадим для каждого типа монет по одной вершине, эти вершины будут соответствовать вашим монетам. Нужно собрать как можно больше уникальных монет, поэтому проведем ребро пропускной способности &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; в сток из каждой такой вершины. В вершины, соответствующие монетам, которые у Вас есть изначально, проведем ребро, пропускная способность которого равна количеству таких монет у вас. Для каждого члена клуба (кроме вас) заведем по одной вершине. Эта вершина может принимать не более одной монеты, которой у него нет и отдавать не более &amp;lt;tex&amp;gt;k-1&amp;lt;/tex&amp;gt; монеты, которых у него &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(k &amp;gt; 1)&amp;lt;/tex&amp;gt;. Естественно, член клуба отдает одну монету взамен одной полученной. Таким образом, в каждую такую вершину нужно провести ребро пропускной способности &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; из вершин соответствующих монетам, которых нет у этого члена клуба. А из этих вершин нужно провести ребра пропускной способностью &amp;lt;tex&amp;gt;k_i - 1&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, соответствующую монетам, которых у члена клуба больше одной. Построенная сеть отражает процессы обмена в клубе. Максимальный поток в такой сети будет равен максимальному количеству монет, которые могуть быть собраны вами.&lt;br /&gt;
===Доказательство корректности===&lt;br /&gt;
Как уже было сказано, построенная сеть отражает процессы обмена в клубе, пример можно посмотреть на картинке выше. Заметим следующее: &lt;br /&gt;
* из вершины каждого типа монет может выйти поток, величина которого &amp;lt;tex&amp;gt;\leqslant 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
* в вершины каждого типа монет может войти поток, величина которого не больше количества монет данного типа&lt;br /&gt;
* если коллекционеру нужна эта монета и мы решили дать её, то мы дадим максимум одну монету этого типа, т.к. пропускная способность красного ребра &amp;lt;tex&amp;gt;= 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* если в данную вершину пришёл поток данной величины, то мы должны отдать из этой вершины поток такой же величины. (Из определения потока)&lt;br /&gt;
Всё вышесказанное подтверждает то, что построенная сеть корректно отображает процессы обмена монетами между участниками.    &lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Величину максимального потока можно искать с помощью алгоритма Форда-Фалкерсона, его время работы &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; – величина найденного максимального потока. Заметим, что &amp;lt;tex&amp;gt;|f| \leqslant M&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; – количество типов монет. Также заметим, что &amp;lt;tex&amp;gt;E = M \times 2 + E^*&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E^*&amp;lt;/tex&amp;gt; – общее минимальное число монет, которые нужно получить все коллекционерам (кроме вас), чтобы вступить в клуб &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; сумма типов монет, которых больше &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, по всем коллекционерам. Из всего этого следует, что итоговое время работы будет &amp;lt;tex&amp;gt;O(ME)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[Схема алгоритма Диница]]&lt;br /&gt;
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]&lt;br /&gt;
* [[Алгоритм масштабирования потока]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://icpc.baylor.edu/regionals/finder/west-siberian-subregional-2016 The 2016 West Siberian Subregional Contest]&lt;br /&gt;
* [https://www.dropbox.com/s/o24szu3mj341wig/WPS2009.pdf?dl=0 Зимняя школа по программированию, Харьков 2009 ]&lt;br /&gt;
* [http://codeforces.com/blog/entry/19068?locale=ru Codeforces лекции Зимней Школы по Программированию]&lt;/div&gt;</summary>
		<author><name>176.59.22.229</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=59555</id>
		<title>Примеры сведения к задачам поиска потока</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=59555"/>
				<updated>2017-01-10T19:54:04Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.22.229: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Рассмотрим несколько задач, которые решаются путём сведения к задаче о поиске максимального потока в сети.&lt;br /&gt;
&lt;br /&gt;
== Пример №1. Лабиринт Минотавра ==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано поле размером &amp;lt;tex&amp;gt;N \times M&amp;lt;/tex&amp;gt;, некоторые клетки поля закрашены. В одной из незакрашенных клеток поля стоит Минотавр, он умеет ходить только по незакрашенным клеткам (из текущей клетки он может пойти только в ту клетку, с которой имеет общую сторону). Какое минимальное количество клеток нужно закрасить, чтобы Минотавр не смог выбраться за пределы поля?&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#if: {{{neat|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #fcfcfc; float:left;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #ddd;&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;|&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: #ddd&amp;quot;&amp;gt;'''Задача:'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border:1px dashed #2f6fab; padding: 8px; background-color: #fcfcfc; font-style: italic;&amp;quot;&amp;gt;{{{definition}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
[[Файл:Monster.png|Пример поля]] [[Файл:MonsterSolution.png|Решение текущего примера]]&lt;br /&gt;
&lt;br /&gt;
Сразу скажем, что выбраться за пределы поля эквивалентно тому, что Минотавр может дойти до какой-либо крайней клетки.&lt;br /&gt;
&lt;br /&gt;
=== Решение и доказательство корректности ===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Минимальное количество клеток, которое нужно закрасить, равно максимальному количеству клеточно-непересекающихся путей из позиции Минотавра до крайних клеток поля.&lt;br /&gt;
|proof=&lt;br /&gt;
Очевидно, что ответ не больше, чем количество всех путей от Минотавра до крайних клеток. Сделаем ещё более строгое неравенство: ответ не больше, чем максимальное количество клеточно-непересекающихся путей, т.к. если взять какие-нибудь &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; пересекающихся пути и закрасить клетку в позиции, где они пересекаются, то блокируется выход за пределы поля сразу по &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; этим путям. С другой стороны, если закрасить клетку на каком-то из путей, то блокируется только этот путь, т.к. были взяты клеточно-непересекающиеся пути. Значит, ответ не меньше, чем количество таких путей.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Переход к сети ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[Определение сети, потока#flow_network|сеть]], в которой вершинам будут соответствовать незакрашенные клетки поля, соседние незакрашенные клетки соединим ориентированными рёбрами с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. В качестве истока возьмём вершину, которой соответствует клетка Минотавр. Добавим в граф ещё одну вершину — сток, добавим рёбра из вершин, соответствующим крайним клеткам поля, в сток с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Чтобы пути не пересекались по клеткам, раздвоим каждую вершину графа на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; вершины: в одну будут только входить рёбра, из другой — только выходить рёбра, и сами эти вершины соединим ребром с пропускной способностью &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Dublicate2.png|center]]&lt;br /&gt;
&lt;br /&gt;
Используя [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину|алгоритм Форда-Фалкерсона]], найдём максимальный поток в сети. Согласно [[Теорема о декомпозиции|теореме о декомпозиции]], нахождение максимального потока эквивалентно тому, что мы нашли максимальное количество путей из истока в сток. Т.е. требуемый ответ на задачу равен максимальному потоку. &lt;br /&gt;
&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма Форда-Фалкерсона &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;. Первое замечание: &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leqslant&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leqslant&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4NM&amp;lt;/tex&amp;gt; (это следует из того, что из каждой вершины исходит не более &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; рёбер), т.е. &amp;lt;tex&amp;gt;E=O(NM)&amp;lt;/tex&amp;gt;. Второе замечание: ответ не превосходит &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, т.к. можно закрасить клетку слева, справа, сверху и снизу от позиции Минотавра и он не сможет никуда двигаться, поэтому &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; можно считать константой. Итоговое время работы &amp;lt;tex&amp;gt;O(NM)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;br /&gt;
&lt;br /&gt;
==Пример №2. Испорченный паркет.==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дан паркет размером &amp;lt;tex&amp;gt;N \times M&amp;lt;/tex&amp;gt;, некоторые клетки которого испорчены, их необходимо закрыть новыми плитками. Плитки бывают размером &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; ценой &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;1 \times 1&amp;lt;/tex&amp;gt; ценой &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. Плитки можно поворачивать, но нельзя разрезать. Какую минимальную сумму нужно потратить, что бы заложить испорченные плитки паркета. Новые плитки не должны перекрывать никакие другие плитки.&lt;br /&gt;
}}&lt;br /&gt;
===Решение===&lt;br /&gt;
[[Файл:Parquet_example_1.png|Пример паркета]]&lt;br /&gt;
[[Файл:Parquet_example_2.png|Пример раскраски]]&lt;br /&gt;
&lt;br /&gt;
Сначала проверим, что &amp;lt;tex&amp;gt;2 \times B&amp;gt;A&amp;lt;/tex&amp;gt;. Если это условие не выполнено, то все выгодней замостить только плитками &amp;lt;tex&amp;gt;1 \times 1&amp;lt;/tex&amp;gt; и больше нечего считать. Теперь на нужно максимизировать количество плиток ценой &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Раскрасим наш паркет по принципу шахматной доски, тогда один конец плитки &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; будет лежать на черной клетке, другой – на белой. Итак, построим двудольный граф, одна доля которого будет содержать белые клетки, другая – черные. Ребра весом в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; проведем между граничащими клетками. Добавим исток с ребрами в белые вершины весом в бесконечность и сток с ребрами из черных клеток весом тоже в бесконечность. Пускай &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; – величина найденного максимального потока между истоком и стоком, это и будет количество плиток &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt;. Ответом к задаче будет величина &amp;lt;tex&amp;gt;f \times A+(K-f) \times B&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; – общее число испорченных клеток.&lt;br /&gt;
===Доказательство корректности===&lt;br /&gt;
Заметим следующее: по сути мы ищем максимальное паросочетание в двудольном графе. Это означает, что белая вершина будет соединена не более чем с одной чёрной и наоборот – это именно то, что нам нужно, ведь соединяя чёрную клетку с белой, мы понимаем, что можем разместить здесь плитку размером &amp;lt;tex&amp;gt;2 \times 1&amp;lt;/tex&amp;gt; и она не будет ни с чем пересекаться. Теперь мы ищем максимальное число таких рёбер. Это всё происходит также, как и в сведении задачи поиска максимального паросочетания к задаче о нахождении максимального потока.&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Величину максимального потока можно искать с помощью алгоритма Форда-Фалкерсона, его время работы &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; – величина найденного максимального потока. Заметим, что &amp;lt;tex&amp;gt;|f| \leqslant  \dfrac K 2&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; – общее число испорченных клеток. Также заметим, что &amp;lt;tex&amp;gt;E \leqslant K \times 4&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; рёбер исходят из истока и входят в сток и максимум &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; ребра могут исходить из вершины в левой доле в правую. Из всего этого следует, что итоговое время работы будет &amp;lt;tex&amp;gt;O(K^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
==Пример №3. Коллекционер монет.==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=Есть &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; коллекционеров и &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; видов монет. Для вступления в клуб, необходимо иметь не меньше одной монеты каждого типа. Вы (у вас номер 1) можете меняться с коллекционерами имеющимися монетами. Любой коллекционер обменяет монету свою монету &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; на вашу монету &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, если у него '''больше''' одной монеты типа &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и нету ни одной монеты типа &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Вы, в свою очередь, можете нарушать это правило. Нужно набрать как можно больше типов монет по известной ситуации у всех коллекционеров.&lt;br /&gt;
}}&lt;br /&gt;
===Решение===&lt;br /&gt;
[[Файл:Coints_task.gif|400px|thumb|right|Жёлтые вершины – монеты разных типов, синие – коллекционеры. Красное ребро означает, что коллекционеру нужна монета этого типа, причём пропускная способнасть этого ребра равна 1, зелёное – что у него больше одной монеты данного типа]]&lt;br /&gt;
Построим сеть следующего вида: создадим для каждого типа монет по одной вершине, эти вершины будут соответствовать вашим монетам. Нужно собрать как можно больше уникальных монет, поэтому проведем ребро пропускной способности &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; в сток из каждой такой вершины. В вершины, соответствующие монетам, которые у Вас есть изначально, проведем ребро, пропускная способность которого равна количеству таких монет у вас. Для каждого члена клуба (кроме вас) заведем по одной вершине. Эта вершина может принимать не более одной монеты, которой у него нет и отдавать не более &amp;lt;tex&amp;gt;k-1&amp;lt;/tex&amp;gt; монеты, которых у него &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(k &amp;gt; 1)&amp;lt;/tex&amp;gt;. Естественно, член клуба отдает одну монету взамен одной полученной. Таким образом, в каждую такую вершину нужно провести ребро пропускной способности &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; из вершин соответствующих монетам, которых нет у этого члена клуба. А из этих вершин нужно провести ребра пропускной способностью &amp;lt;tex&amp;gt;k_i - 1&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, соответствующую монетам, которых у члена клуба больше одной. Построенная сеть отражает процессы обмена в клубе. Максимальный поток в такой сети будет равен максимальному количеству монет, которые могуть быть собраны вами.&lt;br /&gt;
===Доказательство корректности===&lt;br /&gt;
Как уже было сказано, построенная сеть отражает процессы обмена в клубе, пример можно посмотреть на картинке выше. Заметим следующее: &lt;br /&gt;
* из вершины каждого типа монет может выйти поток, величина которого &amp;lt;tex&amp;gt;\leqslant 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
* в вершины каждого типа монет может войти поток, величина которого не больше количества монет данного типа&lt;br /&gt;
* если коллекционеру нужна эта монета и мы решили дать её, то мы дадим максимум одну монету этого типа, т.к. пропускная способность красного ребра &amp;lt;tex&amp;gt;= 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* если в данную вершину пришёл поток данной величины, то мы должны отдать из этой вершины поток такой же величины. (Из определения потока)&lt;br /&gt;
Всё вышесказанное подтверждает то, что построенная сеть корректно отображает процессы обмена монетами между участниками.    &lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
&lt;br /&gt;
Величину максимального потока можно искать с помощью алгоритма Форда-Фалкерсона, его время работы &amp;lt;tex&amp;gt;O(E|f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|f|&amp;lt;/tex&amp;gt; – величина найденного максимального потока. Заметим, что &amp;lt;tex&amp;gt;|f| \leqslant M&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; – количество типов монет. Также заметим, что &amp;lt;tex&amp;gt;E = M \times 2 + E^*&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E^*&amp;lt;/tex&amp;gt; – общее минимальное число монет, которые нужно получить все коллекционерам (кроме вас), чтобы вступить в клуб &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; сумма типов монет, которых больше &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, по всем коллекционерам. Из всего этого следует, что итоговое время работы будет &amp;lt;tex&amp;gt;O(ME)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[Схема алгоритма Диница]]&lt;br /&gt;
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]&lt;br /&gt;
* [[Алгоритм масштабирования потока]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://icpc.baylor.edu/regionals/finder/west-siberian-subregional-2016 The 2016 West Siberian Subregional Contest]&lt;br /&gt;
* [https://www.dropbox.com/s/o24szu3mj341wig/WPS2009.pdf?dl=0 Зимняя школа по программированию, Харьков 2009 ]&lt;br /&gt;
* [http://codeforces.com/blog/entry/19068?locale=ru Codeforces лекции Зимней Школы по Программированию]&lt;/div&gt;</summary>
		<author><name>176.59.22.229</name></author>	</entry>

	</feed>