Вы перебираете все возможные граничные затраты, что приводит к внешнему циклу O (m). Обратите внимание, что если график отключен, когда вы отбрасываете все ребра> w (e), он также отключается для> w (e '), где w(e') < w(e)
. Вы можете использовать это свойство, чтобы выполнить бинарный поиск по граничным затратам и, таким образом, сделать это в O (log (n)).
lo=min(w(e) for e in edges), hi=max(w(e) for e in edges)
while lo<hi:
mid=(lo+hi)/2
if connected(graph after discarding all e where w(e)>w(mid)):
lo=mid
else:
hi=mid-1
return lo
Бинарный поиск имеет сложность O (log (max_e-min_e)) (вы можете фактически уменьшить его до O (log (ребра)), и отбрасывание ребер и определение связности может быть сделано в O (ребра + вершины) , так что это можно сделать в O ((ребро + вершины) * log (ребра)).
Предупреждение: я еще не проверял это в коде, поэтому могут быть ошибки. Но идея должна работать.