|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
||||||
Сталкер (не проходит по памяти)12.03.2023, 21:34. Показов 5391. Ответов 36
Метки нет (Все метки)
В городе Н при невыясненных обстоятельствах территория одного из заводов превратилась в аномальную зону. Все подъезды к территории были перекрыты, а сама она получила название промзоны. В промзоне находятся N зданий, некоторые из них соединены дорогами. По любой дороге можно перемещаться в обоих направлениях.
Начинающий сталкер получил задание добраться до склада в промзоне. Он нашел в электронном архиве несколько карт территории промзоны. Так как карты составлялись разными людьми, то на каждой из них есть информация только о некоторых дорогах промзоны. Одна и та же дорога может присутствовать на нескольких картах. В пути сталкер может загружать из архива на мобильный телефон по одной карте. При загрузке новой карты предыдущая в памяти телефона не сохраняется. Сталкер может перемещаться лишь по дорогам, отмеченным на карте, загруженной на данный момент. Каждая загрузка карты стоит 1 рубль. Для минимизации расходов сталкеру нужно выбрать такой маршрут, чтобы как можно меньшее число раз загружать карты. Сталкер может загружать одну и ту же карту несколько раз, при этом придется заплатить за каждую загрузку. Изначально в памяти мобильного телефона нет никакой карты. Требуется написать программу, которая вычисляет минимальную сумму расходов, необходимую сталкеру, чтобы добраться от входа в промзону до склада. Формат ввода В первой строке входного файла находятся два натуральных числа N и K (2 ≤ N ≤ 2000; 1 ≤ K ≤ 2000) - количество зданий промзоны и количество карт соответственно. Вход в промзону находится в здании с номером 1, а склад - в здании с номером N. В последующих строках находится информация об имеющихся картах. Первая строка описания i-ой карты содержит число ri - количество дорог, обозначенных на i-ой карте. Затем идут ri строк, содержащие по два натуральных числа a и b (1 ≤ a, b ≤ N; a ≠ b), означающих наличие на i-ой карте дороги, соединяющей здания a и b. Суммарное количество дорог, обозначенных на всех картах, не превышает 300 000 (r1 + r2 + ... + rK ≤ 300 000). Формат выходных данных В выходной файл необходимо вывести одно число - минимальную сумму расходов сталкера. В случае, если до склада добраться невозможно, выведите число -1. Пример. Ввод: 12 4 4 1 6 2 4 7 9 10 12 3 1 4 7 11 3 6 3 2 5 4 11 8 9 5 3 10 10 7 7 2 12 3 5 12 Вывод: 3 Мой алгоритм такой: каждую карту разбиваю на компоненты связности и далее строю граф, где вершиной является номер компонента связности. И далее иду по этому графу обходом в ширину. Так же учитываю, что начало и конец могут быть сразу в нескольких компонентах связности. Мой алгоритм вроде выдает верный ответ, но по памяти все плохо. Что я делаю не так? Мой код:
0
|
||||||
| 12.03.2023, 21:34 | |
|
Ответы с готовыми решениями:
36
помогите оптимизировать программу. Не проходит тест, из-за большого количества используемой памяти. FreeZoneMods Онлайн Сталкер ЧН Вылеты в Сталкер ЗП/Сигероус мод 2.1 |
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 09:19 [ТС] | |
|
eaa, да, ошибся
0
|
|
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 09:38 [ТС] | |
|
eaa, использовать дек вместо очереди? Думаете из-за очереди памяти много тратиться?
0
|
|
|
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
|
|
| 13.03.2023, 12:05 | |
|
А какие ограничения на память? Питон тратит 28 байт на целое число, оценочно придется потратить порядка 100МБ (2к х 2к х 28) + что-то на служебные расходы, грубо говоря 120-150МБ. Возможно стоит воспользоваться менее расточительным ЯП.
0
|
|
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 12:11 [ТС] | |
|
256 МБ
0
|
|
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
||
| 13.03.2023, 12:13 [ТС] | ||
|
0
|
||
|
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
|
|
| 13.03.2023, 13:05 | |
|
Я тут понял, что чересчур оптимистично память посчитал. Давайте еще раз.
Граф в котором ищем путь: Вершины - пара (город, карта) Ребра - с весом 1: (город_i, карта_j) - (город_i, карта_к), т.е. загрузка новой карты и с весом 0: (город_i, карта_j) - (город_к, карта_j), т.е. перемещение по карте. Ищем поиском в ширину. Что по памяти потребуется? Множество посещенных вершин + список(очередь) текущих вершин. 200МБ, да? Ну и на хранение графа примерно столько же. Небольшой перебор намечается, придется вершину кодировать одним числом. Впритык, но вроде укладываемся. С С++ вообще не должно быть проблем
1
|
|
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 13:30 [ТС] | |
|
Red white socks, можете, пожалуйста, алгоритм немного поподробнее описать? В особенности, как строить такой граф.
Добавлено через 4 минуты Red white socks, Я так понимаю надо все вершины одной карты связать с номером карты. Так же одна вершина может быть связана с несколькими картами и дороги оставить (то есть вершина может быть связана и с другими вершинами?). Вершины, обозначающие карты надо как-то обозначить, чтобы те от обычных вершин отличались (как?) и далее при проходе через такую вершину прибавлять 1? То есть по итогу мы получаем граф 1, 0? Если, да, то как его обойти? Через алгоритм Дейкстры или немного изменить bfs (идти в глубину пока не наткнемся на вершину с картой)? Я верно понял алгоритм?
0
|
|
|
Status 418
|
||||||
| 13.03.2023, 13:32 | ||||||
|
я тут с утра начинал решать... но пока нет времени...
DarkShaddow, 0-1 bfs погугли
2
|
||||||
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 13:33 [ТС] | |
|
eaa, только я так и не совсем понял, где использовать дек. Вместо очереди?
0
|
|
|
Status 418
|
|
| 13.03.2023, 13:34 | |
|
2
|
|
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
||
| 13.03.2023, 13:37 [ТС] | ||
|
0
|
||
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|||
| 13.03.2023, 13:53 [ТС] | |||
|
eaa,
Добавлено через 2 минуты + у меня есть возможноть отправить решение через PyPy (он обычно быстрей стандартного питона, но памяти больше ест)
0
|
|||
|
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
|
||||||
| 13.03.2023, 13:56 | ||||||
|
DarkShaddow, ну так у тебя, напимер, на таком графе:
Кликните здесь для просмотра всего текста
2
|
||||||
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 14:03 [ТС] | |
|
rRczZZ,
То есть все же лучше переделать граф (соединить вершины с картами) и считать через 0-1 bfs. Верно?
0
|
|
|
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
|
||
| 13.03.2023, 14:31 | ||
|
Нумеруем города и карты. Потребуется множество посещенных вершин (город, карта) и две очереди со списком текущих вершин. Для удобства пусть также у нас есть функция получения связных вершин (не путать с соседними) к данной по данной карте. Шаг 0. Инициализируем счетчик шагов со значением 1. Добавляем в первую очередь стартовый город (здание) по всем картам (далее все занесения в очередь проводятся с проверкой на посещение и занесением во множество посещенных вершин). Шаг 1а. По каждой вершине первой очереди добавляем во вторую очередь связные к ней вершины (которые не посещались). Шаг 1б. Увеличиваем счетчик шагов на 1. По каждой вершине из второй очереди и добавляем в первую с тем же номером города, но с другой карты (если нет в списке посещения). Когда очередь 2 стала пуста - переходим к шагу 1а. Выход из цикла - посещение конечного города на любой карте. В счетчике шагов будет ответ.
1
|
||
|
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
|
|
| 13.03.2023, 14:40 [ТС] | |
|
Только, как я понимаю вы имели ввиду здания, а не города (в условиях задачи именно здания)?
0
|
|
| 13.03.2023, 14:40 | |
|
Помогаю со студенческими работами здесь
20
FreeZoneMods на Лазарусе в Онлайн Сталкер ЧН Не запускается игра Сталкер Чистое небо Долгие загрузки в Сталкер: Зов Припяти Апгрейд для игры в Warfase, Сталкер. Сумасшедший сталкер в Stalker: Тень Чернобыля Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|