Блог пользователя Quercitron

Автор Quercitron, 12 лет назад, По-русски

Мои программы на C# с dfs получают Runtime Error, видимо из-за переполнения стека.

Стандартный размер стека у треда в C# -- 1 МБ. Из-за этого программа без изменения размера стека падала на крупных тестах как на сервере, так и у меня локально.

Я прочитал, что новому треду при создании можно попытаться задать максимальный размер. Я увеличил его до 100 МБ, и это решило проблему локально, но на сервере решение продолжает падать. Возможно на сервере не хватает прав на увеличения стека.

Подскажите, пожалуйста, как мне справиться с этой проблемой.

Полный текст и комментарии »

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

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

Вот образовалась у меня задача, а как решить -- не знаю. Задача полностью из головы, поэтому никаких ссылок нет.

Есть невзвешенный ориентированный граф (мне нужен случай разреженного графа, количество ребер меньше 3*{количество вершин}, но это мало влияет на суть задачи), в графе могут быть циклы. Надо найти самый длинный путь из заданной вершины, который не проходит через одну и ту же вершину больше одного раза.

Я не могу придумать алгоритм, который работал бы за полиномиальное от количества вершин время. И что-то у меня возникли сомнения в его существовании (задача чем-то похожа на задачу о коммивояжере).

Буду благодарен, если кто-то расскажет такой алгоритм, либо подтвердит мои сомнения. Заранее спасибо.

UPD. Действительно, достаточно очевидно, что решение этой задачи равносильно нахождению гамильтонова пути в графе, что, как известно, является NP-полной задачей. Спасибо MikeMirzayanov и Edvard.

Так же большое спасибо goo.gl_SsAhv за предложенное решение. Хотя оно, как видно, и неправильное, но очень интересное и поучительное для меня. Из неправильных решений иногда можно подчерпнуть не меньше, чем из правильных

Полный текст и комментарии »

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

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

Долго пытался найти, почему мое решение получает Runtime Error. Было установлено, что программа падает во время подсчета "векторного произведения" по трем точкам, текст ошибки:
"Project E.exe raised exception class EIntOverflow with message 'Integer overflow'."
Координаты точек не превосходили по модулю 10^9, значит координаты векторов не больше 2*10^9, и получаемый результат больше 8*10^18 никак не мог быть. А int64 это примерно до 9*10^18, и вроде все должно замечательно работать.
Тогда я поймал значения, на которых программа падала в этом месте. И получилась весьма странная вещь, суть которой сводится к следующему: если запустить такую программу:
{"dollar"Q+}
uses SysUtils;
var
  a, b, c: int64;
procedure bug;
begin
    a := -1834569418;
    b := -330651027;
    c := a * b;
end;
Begin
  bug;
End.
("dollar" -- это знак доллара, но я так и не понял, можно ли его вставить в текст здесь)
то при умножении a на b случается описанная выше ошибка.
Но если выключить директиву проверки на переполнение целочисленных операций Q: {Q-} то все будет выполняться без ошибок. Так же было установлено, что даже с включенной Q+, если производить умножение в основном теле программы (т.е. между Begin и End.), то все будет нормально все будет нормально, пока включен оптимизатор (O+), а если его выключить, то и там падает... При этом числа не обязательно только такие, их можно менять в довольно большом диапазоне (+/- 5-10 %).
Короче, полная хрень какая-то.
Я хочу узнать, может кто-нибудь сталкивался с похожими вещами или просто может объяснить, почему такое происходит и как с этим бороться.
Заранее спасибо.

Полный текст и комментарии »

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