Услышал следующую проблему в Google Code Jam. Конкурс закончился сейчас, так что об этом можно поговорить https://code.google.com/codejam/contest/2270488/dashboard#s=p3
Следуя старой карте, вы наткнулись на секретную сокровищницу Страшного Пирата Ларри!
Сокровищница состоит из N запертых сундуков, каждый из которых может быть открыт только ключом определенного типа. Кроме того, как только ключ используется для открытия сундука, его больше нельзя использовать снова. Внутри каждого сундука вы, конечно, найдете много сокровищ, и вы также можете найти один или несколько ключей, которые вы можете использовать, чтобы открыть другие сундуки. Сундук может содержать несколько ключей того же типа, и вы можете удерживать любое количество клавиш.
У вас уже есть хотя бы один ключ, и ваша карта говорит, какие другие ключи можно найти внутри разных сундуков. Со всей этой информацией вы можете понять, как разблокировать все сундуки?
Если есть несколько способов открыть все сундуки, выберите "лексикографически наименьший" способ.
Для соревнований были два набора данных: небольшой набор данных с мечами не более 20 сундуков и большой набор данных с мешками размером до 200 сундуков.
Мой алгоритм с обратным трассировкой был только достаточно быстрым, чтобы решить небольшой набор данных. Какой более быстрый алгоритм?