1precpmtnrifmax — различия между версиями
Sementry (обсуждение | вклад) (Добавил Modify и общий алгоритм.) |
Sementry (обсуждение | вклад) м (→Общий алгоритм: минус жир) |
||
Строка 23: | Строка 23: | ||
=== Общий алгоритм === | === Общий алгоритм === | ||
− | Выполним Modify(), после чего разобъем все множество работ на блоки и для каждого блока запустим | + | Выполним Modify(), после чего разобъем все множество работ на блоки и для каждого блока запустим Decompose(): |
<tex> 1 \mid prec, pmtn, r_i \mid f_{max} </tex>() | <tex> 1 \mid prec, pmtn, r_i \mid f_{max} </tex>() | ||
1 Modify() | 1 Modify() | ||
− | 2 B = | + | 2 B = Blocks(<tex> \{1 \ldots n \} </tex>) |
3 ans = - <tex> \infty </tex> | 3 ans = - <tex> \infty </tex> | ||
4 for (<tex> B_i \in </tex> B): | 4 for (<tex> B_i \in </tex> B): | ||
− | 5 ans = <tex> \max </tex> (ans, | + | 5 ans = <tex> \max </tex> (ans, Decompose(<tex> B_i </tex>)) |
6 return ans | 6 return ans | ||
== Время работы == | == Время работы == | ||
Лемма: время работы алгоритма <tex> 1 \mid prec, pmtn, r_i \mid f_{max} </tex> — <tex> O(n^2) </tex> операций. | Лемма: время работы алгоритма <tex> 1 \mid prec, pmtn, r_i \mid f_{max} </tex> — <tex> O(n^2) </tex> операций. |
Версия 18:12, 3 июня 2012
Содержание
Постановка задачи
Задача , но здесь у работ также есть времена появления, раньше которых их делать запрещено, и их можно прерывать.
является обобщениемАлгоритм
Работу будем обозначать просто ее номером (
), при этом, номера работ могут меняться в зависимости от того, по какому параметру они отсортированы. Время появления работы — , время, требуемое для ее выполнения — . Множество ребер графа обозначается как .Modify
Для начала, модифицируем времена появления работ. Если работа
зависит от , то, очевидно, она не может быть начата раньше, чем закончится выполнение </tex> i </tex>, поэтому нужно заменить на . Алгоритм, делающий это, представлен ниже (работы рассматриваются в порядке топологической сортировки):Modify() 1 for i2 for j: ij 3
После выполнения этого алгоритма для любых двух работ
, таких, что зависит от , выполняется , поэтому, при рассмотрении работ в порядке неубывания времен их появления, они также будут топологически отсортированы.Blocks
Здесь и далее считается, что работы отсортированы в порядке неубывания модифицированных
.Decompose
Идея следующая: допустим, у нас есть блок работ, который можно выполнить без прерываний. Найдем работу
, которую выгодно выполнить последней. Разобъем оставшееся множество работ на блоки, решим задачу для этих блоков рекурсивно и вставим в промежутки между этими блоками, до них и после них, начиная с .Общий алгоритм
Выполним Modify(), после чего разобъем все множество работ на блоки и для каждого блока запустим Decompose():
() 1 Modify() 2 B = Blocks( ) 3 ans = - 4 for ( B): 5 ans = (ans, Decompose( )) 6 return ans
Время работы
Лемма: время работы алгоритма
— операций.