Задача на Swift: какие объекты утекут из-за циклов ссылок
Условие
Смоделируйте ARC. Есть n объектов (номера с 1), r корней (на каждый корень есть одна внешняя сильная ссылка) и m ссылок между объектами: a b strong или a b weak. Ссылки могут повторяться и указывать на себя.
ARC освобождает объект, когда число сильных ссылок на него (из корней и от ещё не освобождённых объектов) становится нулём, при освобождении пропадают и его исходящие ссылки. Утёкшие объекты: не освобождены и недостижимы из корней по сильным ссылкам.
Ввод: n m r (1 ≤ n ≤ 10⁴, 0 ≤ m ≤ 10⁴), строка с r номерами корней (может быть пустой), затем m строк со ссылками.
Выведите номера утёкших объектов по возрастанию через пробел или none.
Пример
5 5 1
1
1 2 strong
2 3 strong
3 2 weak
4 5 strong
5 4 strong
4 5
Цикл 2 ↔ 3 разорван слабой ссылкой, а 4 ↔ 5 держат друг друга.
Как подойти
Каскад нулевых счётчиков + обход из корней.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Утечка через NotificationCenter
- Порядок событий при освобождении объекта