То, что вы описываете, может быть смоделировано с помощью направленного ациклического графа , в котором каждый узел представляет какое-то событие, ребро от u до v означает, что u должно идти раньше v.
Учитывая это представление, я считаю, что вы можете эффективно (за время O (n + m), где n - количество событий, а m - количество ограничений) определить самое позднее возможное время, когда какое-либо событие могло произойти, используя модифицированная топологическая сортировка . В частности, начните выполнять стандартную топологическую сортировку узлов, но всякий раз, когда вы будете расширять узел, представляющий рассматриваемое событие, вместо этого пропустите его и вместо этого разверните другие узлы (другими словами, выберите другой исходный узел). Когда вы полностью исчерпали другие узлы для расширения, у вас останется группа обеспечения доступности баз данных, в которой есть только один исходный узел, а именно узел, который вы хотите расширить. Таким образом, узлы, которые вы ранее расширили, являются событиями, которые потенциально могут произойти до того, как вам интересно, поэтому вы можете получить его последнюю возможную позицию, увидев, сколько событий предшествует этому.
В качестве оптимизации, если у вас есть фиксированная структура (вы не добавляете никаких событий или зависимостей), вы можете предварительно вычислить эту информацию, посчитав, сколько узлов-потомков имеет каждый узел в группе обеспечения доступности баз данных. Число потомков узла - это количество узлов, которые не могут быть расположены перед ним в любом топологически отсортированном порядке, и эта информация может быть вычислена один раз за время O (n + m). Как только вы кешируете это, последняя возможная позиция для каждого элемента будет n - 1 - k, где k - количество потомков этого узла.
Надеюсь, это поможет!