Изменения

Перейти к: навигация, поиск

Pintreepi1Lmax

1727 байт добавлено, 22:58, 30 мая 2016
Второй шаг
=== Идея ===
Все работы хранятся в качестве вершин [[Классификация задач#Зависимость между работамиintree|intree-дерева]], состоящем из <tex>n</tex> вершин. В intree-дереве у одной вершины может быть два и более родителей.
Решение задачи состоит из двух шагов:
=== Псевдокод ===
==== Первый шаг ====
Алгоритм изменения сроков:На первом шаге мы релаксируем дедлайны всех работ, кроме листовой, в соответствии с предыдущим пунктом. * В массиве <tex>\mathtt d</tex> хранятся дедлайны работ.* В массиве <tex>\mathtt {parents}</tex> {{---}} массив предков <tex>i = 0</tex>-й работы. deque = * В переменной <tex>\varnothingmathtt i</tex> '''for''' k = 1 хранится номер листа (он один, см.условие задачи). n '''ifDeque<int>''' k.parents =deque = <tex>\varnothing</tex> i = k <font color=green> // такая вершина только одна (intree-дерево) </font> deque.push(i) <font color=green> // пустой дек </font> '''while''' '''not''' deque.isEmpty() i '''int''' j = deque.removeFirst() '''for''' j k '''in''' i.parents[j] j.deadline d[k] = min(d[k], d[j.deadline, i.deadline ] - 1) stackdeque.add_lastaddLast(jk)
==== Второй шаг ====
На втором этапе алгоритма работы сортируются в неубывающем порядке их дедлайнов. Предполагается, что работы будут занумерованы так, что <tex>d_{i} \leqslant d_{j}</tex>, если <tex>i \leqslant j</tex>.
* В переменной <tex>\mathtt F</tex> хранится время, когда какой-либо станок освободится.
* В массиве <tex>\mathtt r</tex> хранится информация о максимальном времени завершении обработки родителя.
* Массив <tex>\mathtt q</tex> хранит информацию о количестве работ, готовых к исполнению (находящихся в очереди) в момент времени <tex>t</tex>.
* Массив <tex>\mathtt x</tex> хранит информацию о начале выполнения работы <tex>i</tex>.
* В массиве <tex>\mathtt {child}</tex> хранится индекс ребенка <tex>i</tex>-й работы.
F = 0
'''for''' '''int''' i = 1 .. n
r[i] = 0
'''for''' '''int''' t = 0 .. n
q[t] = 0
'''for''' '''int''' i = 1 .. n '''int''' t = max(r[i], F)
x[i] = t
q[t] = q[t] + 1
'''if''' q[t] == m
F = t + 1
'''int''' j = child[i.child()]
r[j] = max(r[j], t + 1)
 
В результате ответ можно получить, зная конечный массив <tex>\mathtt x</tex> и делайны работ: <tex>L_{max} = \max\limits_i (\mathtt x[i] + 1 - d_{i}</tex>), так как все работы выполняются единицу времени, следовательно, <tex>C_{i} = \mathtt x[i] + 1</tex>. Можно заметить, что при вычислении ответа неважно, какие дедлайны использовать, начальные или релаксированные, потому что для любого <tex>k</tex> и его предка <tex>i</tex> либо производится релаксация и выполняется равенство <tex> d_{k} = d_{i} - 1</tex>, а значит, после релаксации максимум не изменится, поскольку при замене дедлайна на меньший максимум увеличится, а новое значение <tex>L_{k}</tex> будет равно <tex>L_{i}</tex>, либо мы не делали релаксацию, и значение <tex>d_{k}</tex>, и, следовательно, <tex>L_{k}</tex> не поменяются.
=== Доказательство корректности ===
==== Асимптотика ====
# На первом шаге мы посещаем каждую вершину не более двух раз (первый {{---}} когда ищем вершину без родителя, второй {{---}} когда релаксируем дедлайны) за <tex>O(n)</tex> времени.
# Делаем сортировку вершин за <tex>O(n \log n)</tex>, а затем для каждой обходим все вершины по разу и считаем время начала выполнения каждой работы, в сумме за линейное время<tex>O(n)</tex>.
Итоговая сложность {{---}} <tex>O(n \log n)</tex>
317
правок

Навигация