Program Howl; Const MaxN=1000; MaxM=100000; Var N, M: LongInt; {Во время поиска в массиве edge в позициях от index[i] до index[i+1]-1 хранятся дуги, выходящие из вершины i} edge: Array [1..2*MaxM+1] of Record neigh: LongInt; weight: LongInt; End; index: Array [1..MaxN+1] of LongInt; Function Attainable(treshold: LongInt): Boolean; {Функция Attainable с помощью поиска в глубину определяет, существует ли путь из вершины 1 в вершину N по дугам, вес которых не превосходит treshold } Var mark: Array [1..MaxN] of Boolean; Procedure DFS(v: LongInt); Var i: LongInt; Begin If (mark[v] or mark[N]) Then Exit; mark[v]:= true; For i:= index[v] To index[v+1]-1 Do Begin If edge[i].weightright Then right:= e[i].w; If e[i].wleft+1) Do Begin median:= (left+right) div 2; If Attainable(median) Then right:= median Else left:= median; End; {Замечание. Конечно, можно было бы предварительно отсортировать все имеющиеся в графе веса дуга, и потом исполнять поиск по этому массиву весов, а не вообще по всем возможным значениям от минимального до максимального. Это, безусловно, ускорило бы процесс поиска. Правда пришлось бы потратить время на сортировку... Какой вариант эффективнее - зависит от контекста. В данной программе сортировка не выполняется.} {Вывод результата} Assign(f, 'howl.out'); Rewrite(f); Writeln(f, left); Close(f); End.