Поиск компонент связности

В цикле запускать dfs. Отмечать уже помеченные вершины.

Алгоритм поиска компонент связности в графе

Топологическая сортировка

Помечать “времена выхода” из вершины. Отсортировать в порядке убывания времен выхода.

Топологическая сортировка

Бинарный поиск

int l = 0, r = n;
// надо найти х
int x;
while(r - l > 1){
	int mid = (r + l) / 2;
	if(mid < x) l = mid;
	else r = mid;
}
cout << l << "\\n";
vector<ll> a;
// бинарный поиск, возвращают итераторы

auto t = lower_bound(a.begin(), a.end(), to_find); //ищет больше или равный to_find
cout << *t;
upper_bound(a.begin(), a.end(), to_find); //большее значение

Тернарный поиск

double l = ..., r = ..., EPS = ...; // входные данные
while (r - l > EPS) {
   double m1 = l + (r - l) / 3,
      m2 = r - (r - l) / 3;
   if (f (m1) < f (m2))
      l = m1;
   else
      r = m2;
}

Тернарный поиск

Диаметр дерева

Две наиболее удаленные друг от друга вершины

Алгоритм:

  1. DFS от какой-то вершины
  2. DFS от самой удаленной на предыдущем шаге