Задача на Swift: операции с зависимостями и критический путь
Условие
Есть n операций с длительностями и m зависимостей a b: операция a может начаться только после завершения b (как a.addDependency(b)). Параллельность не ограничена, каждая операция стартует, как только готовы все её зависимости.
Выведите две строки: момент завершения всех операций и номер операции, которая завершается последней (при равенстве наименьший номер). Если зависимости образуют цикл, выведите CYCLE (с циклом OperationQueue просто никогда не выполнит эти операции).
Первая строка: n m (1 ≤ n ≤ 10⁴, 0 ≤ m ≤ 10⁴). Вторая: n длительностей от 0 до 1000. Дальше m строк a b (возможны повторы).
Пример
4 3
2 3 1 5
2 1
3 1
4 2
10
4
Как подойти
Топологическая сортировка + самый длинный путь.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Как дождаться нескольких запросов в GCD
Следующий вопрос
Задача на Swift: OperationQueue с ограничением параллельности
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- DispatchQueue.main.sync на главном потоке
- Инструменты GCD и их задачи
- Синхронный доступ к состоянию без очереди