Вроде в тупую так:
1. Строим граф, как и было сказано - вершины - начала и концы задач, продолжительность задачи - взвешенная дуга, вес - продолжительность задачи. Условия задача i должна закончиться раньше начала j - дуга из конца i в начало j с весом 0.
2. Добавляем вершину в которую проводим дуги из всех окончаний с весом 0.
3. Делаем поиск в глубину, но без пометок, из этой вершины по обратным ребрам. При достижении листа смотрим сколько времени понадобилось,выбираем максимум. Если попадаем в обрабатываемую вершину - значит данный граф топологически не отсортировать, и решения нет (например - задача 1 требует 2, а 2 требует 1).
4. Найденный максимум и есть ответ.
Если прооптимизировать, то:
* 3. Поиск с отметками пройденного, для каждой вершины хранить время ее доступа и сколько до максимального листа (заполняем при выходе). При попадании в пройденную вершину - сравнить время доступа до и после, если новое время больше - посчитать новое время для максимального листа, обновить инфо только для этой вершины и сравнить с текущим максимальным временем.
Сложность оптимизированного алгоритма: O(V^2).
Поиск кратчайшего (точнее наибольшего) пути:
Дейкстру тут не получится применить, можно применить Беллмана-Форда, с обратной релаксацией... только в случае реализации графа матрицей смежности сложность будет O(V*E)=O(V^3).
...........вроде так
