Блог пользователя j-j-jackson

Автор j-j-jackson, 13 лет назад, По-русски

Здравствуйте! Недавно решал задачу Timus 1635 "мнемоника и палиндромы". Столкнулся с проблемой: как в C++ создать двумерный массив 4000*4000? Массив graph[4000][4000]. Если я делаю graph[4000][4000], то компилятор сообщает
Runtime error (access violation) ,а если graph[400][400],то завал на 17 тесте. Как решить эту проблему? И можно ли сделать обход в ширину без использования матрицы смежности?

  • Проголосовать: нравится
  • -19
  • Проголосовать: не нравится

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Делайте список смежности. Про него хорошо написано тут в комментариях или тут

»
13 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Если так уж хочется двумерный массив 4000*4000, то можно использовать вектора:

vector<vector<int> > a = vector<vector<int> >(4000,vector<int>(4000,0));

но ̶н̶а̶ ̶C̶F̶,̶н̶а̶п̶р̶и̶м̶е̶р̶,̶ это потребляет ~64MB памяти

»
13 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Access violation возникает потому что память под переменные внутри функций выделяется из стека. Массив интов 4000*4000 в стек не влезает, отсюда обращение к недопустимому участку памяти.

Достаточно объявить массив глобально, то есть изнутри снаружи функции, и ошибка исчезнет. Но конкретно для BFS лучше использовать список смежности.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Здесь можно обойтись массивом boolean 4000 x 4000, он будет занимать 16 мегабайт.