Ctrl K

Перекинуть кабели в офисе

Средняя
В офисе n компьютеров с номерами от 0 до n − 1. Список cables описывает проложенные кабели: пара [a, b] — кабель между компьютерами a и b. Два компьютера могут обмениваться данными, если между ними есть путь по кабелям — напрямую или через другие компьютеры. За один ход можно выдернуть любой проложенный кабель и протянуть его между любыми двумя компьютерами, которые пока не соединены напрямую. Верните наименьшее число ходов, после которого каждый компьютер сможет связаться с каждым. Если это невозможно, верните -1.
Пример 1
n=5, cables=[[0, 1], [1, 2], [2, 0], [3, 4]] → 1

Компьютеры 0, 1, 2 связаны треугольником — один кабель в нём лишний. Переносим его так, чтобы он соединил, например, 2 и 3: сеть становится единой за один перенос.

Пример 2
n=5, cables=[[0, 1], [1, 2], [3, 4]] → -1

Чтобы связать 5 компьютеров, нужно хотя бы 4 кабеля, а их всего 3.

Пример 3
n=3, cables=[[0, 2], [2, 1]] → 0
Ограничения
  • 1 ≤ n ≤ 10⁵
  • 1 ≤ len(cables) ≤ min(n·(n − 1)/2, 10⁵)
  • 0 ≤ a, b < n, a ≠ b
  • Между двумя компьютерами не больше одного кабеля
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСкладываются ли связи в дерево СредняяСколько изолированных групп в сети СредняяЦепочки отношений СредняяГруппы связанных серверов СредняяЛишний кабель Средняя
загружаем Python…
Вход
n=5, cables=[[0, 1], [1, 2], [2, 0], [3, 4]]
Ожидается
1

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 88 тестов на сервере, включая скрытые.