Я предполагаю, что вам также указано число K «рабочих» (процессоров) для выполнения задач. То есть одновременно можно выполнить не более K задач. Ясно, что время, необходимое для выполнения всех задач, будет зависеть от K.
Эта проблема известна как приоритетное планирование.
Если число работников K больше или равно количеству задач N, то решение, предложенное Tryer, является правильным: вес самого тяжелого пути в вашей DAG-зависимости зависит от требуемого времени. (Самый тяжелый путь иногда называют критическим путем , и его можно вычислить за линейное время с использованием специального алгоритма кратчайшего пути.)
Если K = 1, как вы уже заметили, вы просто следуететопологический порядок и требуемое время будут суммой времени задач.
К сожалению, в интересном случае, когда 1 планирования списков . Идея составления списков очень проста. На каждом шаге алгоритма вы перебираете всех своих K рабочих. Для любого из них, который не используется, вы назначаете доступную неназначенную задачу и зависимости которой уже выполнены. Затем вы помечаете эту задачу как назначенную и продолжаете. После того, как все работники заняты или им не могут быть назначены другие задачи, вы ждете завершения некоторых задач и возобновляете алгоритм, как и раньше.
Строго можно доказать, что время T ', в которое алгоритм планирования списков завершит последнюю задачу, составляет самое большее T * + P, где T * - оптимальное время, а P - вес критического пути. ,Таким образом, алгоритм будет хорошо работать, если задачи на критическом пути составляют небольшую долю от общего числа.