Ctrl K

Донести новость до всех

Сложная
В компании people человек, пронумерованных от 0 до people - 1. Люди из списка informed уже знают важную новость. Кроме того, есть односторонние каналы общения: по i-му каналу человек tells_from[i] пересказывает всё, что знает, человеку tells_to[i] (но не наоборот). Новость распространяется по каналам сколько угодно шагов. Вы можете добавлять новые односторонние каналы между любыми двумя людьми. Найдите наименьшее число новых каналов, после добавления которых новость дойдёт до каждого.
Пример 1
people=5, informed=[0], tells_from=[0, 2, 3], tells_to=[1, 3, 2] → 2

Новость от 0 доходит до 1. Люди 2 и 3 пересказывают её друг другу, поэтому хватит одной связи от кого-то, кто уже знает, к 2 или 3. Человек 4 ни с кем не связан — для него нужна ещё одна связь. Итого 2.

Пример 2
people=4, informed=[3], tells_from=[3, 1, 2], tells_to=[1, 2, 0] → 0

Цепочка 3 → 1 → 2 → 0 уже доносит новость до всех, новые связи не нужны.

Пример 3
people=3, informed=[1], tells_from=[], tells_to=[] → 2
Ограничения
  • 2 ≤ people ≤ 10⁵
  • 1 ≤ len(informed) ≤ people, 0 ≤ informed[i] < people
  • 0 ≤ len(tells_from) = len(tells_to) ≤ 2·10⁵
  • 0 ≤ tells_from[i], tells_to[i] < people, tells_from[i] ≠ tells_to[i]
  • Все каналы различны
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиПорядок букв по словарю СложнаяСамый длинный подъём по карте СложнаяКого вылечить первым СложнаяКого отключить от сети СложнаяПрогулки только в гору Сложная
загружаем Python…
Вход
people=5, informed=[0], tells_from=[0, 2, 3], tells_to=[1, 3, 2]
Ожидается
2

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