В цикле запускать 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;
}
Две наиболее удаленные друг от друга вершины
Алгоритм: