
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#1
,
|
|
|
M Оно понятно, что первый блин - комом. Но... Попытка is not пытка, как говаривал тов. Берия. Предлагаю опробовать сий способ разрешения профессиональных споров. Ибо зачем зря воздух сотрясать - мы уже (надеюсь) вышли из детского возраста, у нас в руках есть весь необходимый инструментарий для того, чтобы проверять и поддтверждать свои аргументы не только словами, но и конкретными цифрами статистики и кодом. Итак, с чего все начиналось? Вот с такого вот предложения: Цитата nvm @ Аргументацией было бы сравнение результативности фирм, использующих stl+boost, и не использующих их вовсе. Однако, последних в природе, видимо, не существует (этот факт кто-то поспешит засчитать в пользу необходимости этих технологий, но он вполне объясним и лишь данью моде). nvm, все очень просто - можно устроить небольшое состязание. Выбрать задачку, и посмотреть - кто ее быстрей решит. Я с помощью возможностей stl и boost, или ты (без их помощи). Право выбора оружия, тьфу, т. е. задачи предоставляется тебе. Итоговое сравнение будем проводить по критериям: 1. Размер полученного исходного текста. 2. Размер полученного испольняемого кода. 3. Скорость работы полученного результата. 4. Суммарное время, потраченное на разработку. Понятно, что последнее будет подсчитать сложнее всего, по этому этот показатель можно заменить косвенным признаком - объемом полученного исходного текста. Дополнительное условие - никаких copy-paste из имеющихся заготовок. Т. е. если что-то дописывается "свое", то оно пишется "с нуля". Эта тема была разделена из темы "Java vs VC++" M Эстафета была подхвачена Sazabis'ом (сообщение №2), за что ему большущий респект. Помимо задачи и второго участника остается выбрать секундантов и окончательно определиться с критериями победы, ну и... в бой! |
Сообщ.
#2
,
|
|
|
я могу задачку задать ![]() ![]() ![]() Я бы и сам мог попробовать, но к сожелению, уже сильно подсел ![]() |
Сообщ.
#3
,
|
|
|
Цитата Sazabis @ я могу задачку задать кто будет отстаивать силу С/С++ без str/boost поднимайте руки Против Вас будет Flex Ferrum, может быть еще кто то захочет. Но каждый пишет сам! Если есть желающие переносимся в раздел "Чистый С" Я бы и сам мог попробовать, но к сожелению, уже сильно подсел Отлично! Заодно начинем оттачивать регламент дуэлей! |
Сообщ.
#4
,
|
|
|
..Я его только что прочитал.. Принимаю. Хотя это не совсем по существу сделанного утверждения, но тоже вариант. Пока только нет идей насчет задачи. |
Сообщ.
#5
,
|
|
|
Предлагаю задачу
Цитата Задача. Speed Limits В нашем чрезвычайно деловом мире, мы обычно не интересуемся в выборе кратчайшего пути в смысле расстояния, но нас интересуют маршруты, на которые будет затрачено минимальное время. При езде на автомобиле, это означает существенную роль ограничителей скорости на различных дорогах. Преположим теперь, что некоторые знаки, ограничивающие скорость на дорогах, пропущены. Поскольку водитель не может знать на память ограничители скоростей на всех дорогах, то естественно предположить, что он будет пользоваться значением последнего ограничителя скорости, который он видел. Вы должны написать программу, которая вычисляет оптимальный маршрут (в смысле минимума потраченного на него времени) использующая "пропущенные" знаки ограничения скорости. Вам задано описание сети дорог, состоящей из перекрестков и дорог. Каждая дорога - односторонняя, соединяет ровно два перекрестка и имеет не более одного ограничителя скорости, расположенного в начале дороги. Для любых перекрестков A и B существует не более одной дороги из A в B. Вы можете полагать, что ускорение происходит мгновенно, и никакое другое движение Вам не мешает. И, конечно, Вы никогда не можете ехать быстрее, чем указывает текущий ограничитель скорости. Входные данные Первая строка входного файла speed.in состоит из трех целых чисел: N, M, D, где N (2<=N<=150) - количество перекрестков, пронумерованных от 0 до N-1, M - количество дорог, D - номер перекрестка, в который Вы направляетесь. Каждая из следующих M строк входного файла описывает одну дорогу. Каждая строка состоит из четырех целых чисел A (0<=A<N), B (0<=B<N), V (0<=V<=500), L (1<=L<=500), указывающих, что дорога ведет из A в B, имеет ограничитель скорости V и длину L. Если V равно 0, это означает, что знак ограничителя скорости на этой дороге отсутствует (пропущен). Время перемещения по этой дороге равно T = L / V, если V<>0, иначе T = L / Vold, где Vold - ограничитель скорости, использованный последним, прежде чем Вы прибыли на этот перекресток. Заметим, что деление нужно осуществлять вещественное, чтобы избежать неправильных округлений. В начале пути Вы находитесь на перекрестке 0, и текущая скорость равна 70. Выходные данные Выходной файл должен содержать одну строку целых чисел, описывающих номера перекрестков в порядке посещения на самом быстром маршруте из перекрестка 0 в перекресток D, начиная с 0 и заканчивая D. Гарантируется единственность такого маршрута для всех тестовых файлов. Пример speed.in speed.out 6 15 1 0 5 2 3 1 0 1 25 68 0 2 30 50 0 5 0 101 1 2 70 77 1 3 35 42 2 0 0 22 2 1 40 86 2 3 0 23 2 4 45 40 3 1 64 14 3 5 0 23 4 1 95 8 5 1 0 84 5 2 90 64 5 3 36 40 как раз, надо писать граф и все такое |
Сообщ.
#6
,
|
|
|
Задача выглядит сильно не в пользу stl
![]() (чистый перебор с минимальным использованием простых контейнеров). Добавлено Мне задача нравится: большое число мелких объектов в динамической памяти - как раз то, где можно без особых усилий соптимизировать. |
Сообщ.
#7
,
|
|
|
Цитата nvm @ Задача выглядит сильно не в пользу stl (чистый перебор с минимальным использованием простых контейнеров). обычная олимпиадная задачка. Согласен ? Flex Ferrum, Согласен ? тогда погнали... ![]() ЗЫ. Данные не сортированы, в добавок у boost есть "мифический" graph, может его сюда Flex Ferrum, забабашит ![]() |
Сообщ.
#8
,
|
|
|
Цитата Sazabis @ Flex Ferrum, Согласен ? Да. Единственный момент - я сейчас дома несколько безлошадный (питальник в компе погорел), по этому смогу приступить к решению не раньше, чем куплю новый. Цитата Sazabis @ ЗЫ. Данные не сортированы, в добавок у boost есть "мифический" graph, может его сюда Flex Ferrum, забабашит ![]() |
Сообщ.
#9
,
|
|
|
Цитата Sazabis @ Я вот не совсем понял. Дуэль же произошла из темы Java vs C++. nvm на чем будет писать - на С++ или на Java? Если на Java, то он пользуется ихними массивами. А если на С++, без stl, без библиотек, то это бред. Ведь ему и вправду придется писать свое хранилище. В добавок, nvm, тебе нельзя будет использовать даже vector. Поэтому перед решением задачи придеться писать свое хранилище. Добавлено Сорри, прочитал теперь подпись к теме. Мдя ![]() |
Сообщ.
#10
,
|
|
|
Я думаю, что критерием будет:
1. открытый код, проведем голосование среди С++ шников, чтобы им было легче понять, поддержать, так что, пишите КРАСИВО. (И понятными сущностями, вот кстати интересно будет увидеть как сюда впишеться boost::graph ![]() 2. Скорость выполнения, на разных компиляторах, VC6, VC7, BorlandBuilder6 со стандартным компилятором. + Еще бы CW, я думаю (что то мне он понравился после тестов trainer) 3. Посмотрим еще на размер экзешника |
Сообщ.
#11
,
|
|
|
Цитата Leprecon @ А если на С++, без stl, без библиотек, то это бред. Ведь ему и вправду придется писать свое хранилище. Читай цитату nvm'a в первом сообщении. С нее все и пошло. Добавлено Цитата Sazabis @ Скорость выполнения, на разных компиляторах, VC6, VC7, BorlandBuilder6 со стандартным компилятором. + Еще бы CW, я думаю (что то мне он понравился после тестов trainer) Тогда надо определиться со списком целевых компиляторов, ибо от этого будет зависить набор используемых средств. Ну или хотя бы с нижней границей поддержкой стандарта. |
Сообщ.
#12
,
|
|
|
Цитата Flex Ferrum @ Тогда надо определиться со списком целевых компиляторов, ибо от этого будет зависить набор используемых средств. Ну или хотя бы с нижней границей поддержкой стандарта. будет как в жизни ![]() |
Сообщ.
#13
,
|
|
|
Цитата Sazabis @ будет как в жизни попробуем портировать, и бах! так что будте аккуратнее. Пишите соответсвующе. Заодно посмотрим чего больше править придеться. Ок. Буду иметь в виду. Добавлено Ограничения по памяти будем вводить? |
Сообщ.
#14
,
|
|
|
Цитата Sazabis @ Пишите, я откомпилирую.Еще бы CW, я думаю (что то мне он понравился после тестов trainer) CW8 совместим с MSVC6, под него у меня собран boost 1.31 |
Сообщ.
#15
,
|
|
|
Цитата Flex Ferrum @ Ограничения по памяти будем вводить? считаю вполне нормально, если весь граф будет в памяти. Вообще то больше памяти больше не надо? но если хотите... Не давайте лучше решать задачу динамического программировния, а не статического. Иначе требования по времени будут не актуальны. |
Сообщ.
#16
,
|
|
|
Цитата Sazabis @ Не давайте лучше решать задачу динамического программировния, а не статического. Иначе требования по времени будут не актуальны. Так вводим или нет? И если вводим - то какие? Добавлено Кстати, судя по приведенному примеру исходного файла, граф может быть цикличный? Т. е. между двумя перекрестками могут быть две дороги, идущие в разных направлениях? |
Сообщ.
#17
,
|
|
|
Цитата Flex Ferrum @ Так вводим или нет? И если вводим - то какие? мы же не задачу олимпиадную решаем. _Старайтесь_ решить ее используя память O(N) где N кол-во вершин графа. Считайте что вы на собеседовании, фирма делает игры ![]() Добавлено Цитата Flex Ferrum @ Т. е. между двумя перекрестками могут быть две дороги, идущие в разных направлениях? могут Добавлено но смысла возвращаться назад нету ![]() |
Сообщ.
#18
,
|
|
|
Кстати, а кто будет секундантами?
|
Сообщ.
#19
,
|
|
|
Тогда получается, что тестируются два прогера, а не C++ vs C++/stl/boost. Думаю, что после всего можно "всем вместе" (детали потом) отредактировать код и посмотреть, что получилось лучше по заданным критериям.
Добавлено З.Ы. Чтобы не тратить ресурсы впустую, можно выложить оптимальный алгоритм решения задачи, а Флексу и нвм пусть остается сама реализация. |
Сообщ.
#20
,
|
|
|
Цитата Тайлер @ З.Ы. Чтобы не тратить ресурсы впустую, можно выложить оптимальный алгоритм решения задачи, а Флексу и нвм пусть остается сама реализация. Способ решения - известен. Поиск кратчайшего пути на помеченном ориентированном цикличном графе. Оптимальные алгоритмы собственно поиска - тоже (Дейкстры или Бельмана-Форда, но в данном случае достатчно Дейкстры). Так что задача сводится именно к реализации оных алгоритмов. |
Сообщ.
#21
,
|
|
|
ОК, а как насчет моего первого замечания
|
Сообщ.
#22
,
|
|
|
Дабы действительно не изобретать по крайней мере математических велосипедов приведу текст оного алгоритма:
Цитата The following is the pseudo-code for Dijkstra's single-source shortest paths algorithm. w is the edge weight, d is the distance label, and p is the predecessor of each vertex which is used to encode the shortest paths tree. Q is a priority queue that supports the DECREASE-KEY operation. The visitor event points for the algorithm are indicated by the labels on the right. ![]() ![]() DIJKSTRA(G, s, w) for each vertex u in V d[u] := infinity p[u] := u color[u] := WHITE end for color[s] := GRAY d[s] := 0 INSERT(Q, s) while (Q != Ø) u := EXTRACT-MIN(Q) S := S U { u } for each vertex v in Adj[u] if (w(u,v) + d[u] < d[v]) d[v] := w(u,v) + d[u] p[v] := u if (color[v] = WHITE) color[v] := GRAY INSERT(Q, v) else if (color[v] = GRAY) DECREASE-KEY(Q, v) else ... end for color[u] := BLACK end while return (d, p) Взято отсюда: dijkstra_shortest_paths. Добавлено Цитата Тайлер @ ОК, а как насчет моего первого замечания См. пост №22 (предыдущий). |
Сообщ.
#23
,
|
|
|
Цитата Flex Ferrum @ Кстати, а кто будет секундантами? общественность ![]() Цитата Тайлер @ ОК, а как насчет моего первого замечания посмотрим, что у них получиться. Согласен с тем, что бросающиеся в газа ляпы, если будут, можно указать в теме. Добавлено Только пусть хоть что то решают! а то nvm придеться реализовывать только vector<> ![]() |
Сообщ.
#24
,
|
|
|
Цитата Sazabis @ Только пусть хоть что то решают! а то nvm придеться реализовывать только vector<> , что имхо не очень интересно. Ну, от алгоритма на псевдоязыке до его реализации на конкретом ЯВУ путь бывает очень длинным... Или очень коротким... ![]() |
Сообщ.
#25
,
|
|
|
Цитата Flex Ferrum @ Способ решения - известен. Поиск кратчайшего пути на помеченном ориентированном цикличном графе. Оптимальные алгоритмы собственно поиска - тоже (Дейкстры или Бельмана-Форда, но в данном случае достатчно Дейкстры). Так что задача сводится именно к реализации оных алгоритмов. Что-то мне кажется, что задача не сводится к обычному поиску пути - ведь скорость зависит от того, откуда пришли в вершину. Даже динамическое программирование как-то тут непонятно, где применить Может, по-простому, полный перебор путей с отсечением ветвей по Парето? -юсртыхэю Цитата Sazabis @ считаю вполне нормально, если весь граф будет в памяти. Вообще то больше памяти больше не надо? В общем случае выбор между памятью и быстродействием можно предоставлять разработчику. Можно позволить занимать до 400 Мб памяти (типичный объем на слабых машинах). |
Сообщ.
#26
,
|
|
|
Цитата nvm @ Что-то мне кажется, что задача не сводится к обычному поиску пути - ведь скорость зависит от того, откуда пришли в вершину. ![]() полный перебор по любому, или получите приблеженный ответ, в задаче нужен единственно верный. Обещаеться что верный будет один. Добавлено Цитата nvm @ Можно позволить занимать до 400 Мб памяти (типичный объем на слабых машинах). Если Вы будите для этой задачи использовать 400 Мб, то грош Вам цена ![]() ![]() |
Сообщ.
#27
,
|
|
|
Цитата Sazabis @ Если Вы будите для этой задачи использовать 400 Мб, то грош Вам цена ![]() ![]() Я бы не стал так резко высказываться.. Соотношение между используемой памятью и временем работы должно быть разумным: это значит, что при разумном ограничении на объем памяти (512 Мб) и время работы (10 минут) должен максимизироваться допустимый размер исходных данных. Это самый логичный критерий: имеющимися ресурсами решить как можно больше задач. -юсртыхэю Цитата Sazabis @ Цитата Flex Ferrum @ Т. е. между двумя перекрестками могут быть две дороги, идущие в разных направлениях? могут но смысла возвращаться назад нету ![]() Вообще говоря, есть. Легко построить пример. |
Сообщ.
#28
,
|
|
|
Yes!
Цитата Working time for 10000 iterations: 47 msecs. 0 5 2 3 1 Sazabis, давай еще тестовых файликов. Исходный код в аттаче. PS: Исходный текст буквально с колес, пока что особо не причесывал. Компилилось на VC 7.1 Прикреплённый файл ![]() |
Сообщ.
#29
,
|
|
|
Цитата Тайлер @ Тогда получается, что тестируются два прогера, а не C++ vs C++/stl/boost. Думаю, что после всего можно "всем вместе" (детали потом) отредактировать код и посмотреть, что получилось лучше по заданным критериям. Добавлено З.Ы. Чтобы не тратить ресурсы впустую, можно выложить оптимальный алгоритм решения задачи, а Флексу и нвм пусть остается сама реализация. Человеческий фактор в любом случае будет существенен. Но в этом и есть суть затеи (судя по названию). А с алгоритмом нужно хоть примерно определиться, потому что явно не стоит изобретать какие-то сложные эвристики. Добавлено Flex Ferrum, ну ты и быстро - еще даже секунданты флажком не махнули.. ![]() Добавлено Flex Ferrum Неужели этот алгоритм применим?! А как насчет таких входных данных: 4 4 2 0 1 1 1 1 2 0 8 1 3 10 1 3 1 0 1 Какой выдает ответ? Добавлено Кстати, в условии кратные ребра исключены, а петли - нет. Добавлено Пример можно тогда сократить: 3 3 2 0 1 1 1 1 2 0 9 1 1 10 1 Жду ответа на примеры - сам проверить не могу из-за отсутствия библиотек. |
Сообщ.
#30
,
|
|
|
Флекс, CodeWarrior матерится на строку
![]() ![]() Edge& e = *cur_info.m_CurIter; ![]() Цитата и typename'ов хочет(warning'и дает). C/C++ Error 10129 non-const '&' reference initialized to temporary The compiler found that the initializer for a non-const reference is not an appropriate lvalue. long &r = 40000; Fix Use a real variable to initialize reference or use a const reference. long x = 4000; long &y = x; const long &z = 40000; ![]() ![]() ![]() typedef typename graph_traits<Graph>::vertex_descriptor Vertex; typedef typename graph_traits<Graph>::edge_descriptor Edge; typedef typename graph_traits<Graph>::out_edge_iterator EdgeIterator; ![]() ![]() P.S. А у меня этот Metrowerks стоит для побаловаться. ![]() ![]() |
Сообщ.
#31
,
|
|
|
Цитата trainer @ Флекс, CodeWarrior матерится на строку Под CodeWarior компилить не пробовал - по причине его отсутствия. А VC проглотил и не поперхнулся. Даже варнингом не плюнул. |
Сообщ.
#32
,
|
|
|
А если включить ему опцию "ISO C++ Template Parser", то и эту строку:
![]() ![]() property_map<Graph, edge_weight_t>::type weights = get(edge_weight, graph); ![]() |
Сообщ.
#33
,
|
|
|
Цитата nvm @ Неужели этот алгоритм применим?! А как насчет таких входных данных: 4 4 2 0 1 1 1 1 2 0 8 1 3 10 1 3 1 0 1 Какой выдает ответ? Цитата 0 1 2 Цитата nvm @ Пример можно тогда сократить: 3 3 2 0 1 1 1 1 2 0 9 1 1 10 1 Цитата 0 1 2 Добавлено Цитата nvm @ Неужели этот алгоритм применим?! Пока получается, что да. Там цикличность исключается за счет пометки пройденных узлов (массив vertex_colors). Кроме того, глубина поиска уменьшается за счет того, что при первом достижении целевого узла запоминается полученное время (для последующего отбора путей), и если при последующей обработке еще на "полпути" получается время, превышающее ранее зафиксированное, то дальнейшая обработка этого пути прекращается. Цитата nvm @ ну ты и быстро - еще даже секунданты флажком не махнули А это что?: Цитата Sazabis @ тогда погнали... ![]() Добавлено Цитата trainer @ Но по скорости имеет MSVC7.1 в 1.5 раза. ![]() ![]() Кстати, замена в коде adjacency_list на adjacency_matrix понижает производительность примерно вдвое. Но это, впрочем, логично - на итераторы исходящих узлов сваливается гораздо больше работы. |
Сообщ.
#34
,
|
|
|
Цитата Flex Ferrum @ Цитата nvm @ Неужели этот алгоритм применим?! А как насчет таких входных данных: 4 4 2 0 1 1 1 1 2 0 8 1 3 10 1 3 1 0 1 Какой выдает ответ? Цитата 0 1 2 А правильный ответ 0 1 3 1 2, а во втором примере - 0 1 1 2. Так что алгоритм, как и ожидалось, неприменим, или требует радикальной модификации. Кстати, как ты приписываешь скорость дугам без ограничителя? |
Сообщ.
#35
,
|
|
|
Цитата nvm @ А правильный ответ 0 1 3 1 2, Гм. А ты прав, однако... Послушаем - что скажет Sazabis. Впрочем, эту проблему можно достаточно легко решить, если помечать не пройденные узлы, а пройденные ребра. Цитата nvm @ Кстати, как ты приписываешь скорость дугам без ограничителя? Как и сказано в условии - использую значение последнего "виденного" ограничителя. Добавлено nvm, обрати внимание: Цитата Sazabis @ Каждая дорога - односторонняя, соединяет ровно два перекрестка Т. е. дорог, исходящих и из перекрестка и входящих в него же быть не может, а значит твой пример №2 не соответствует условиям задачи. |
Сообщ.
#36
,
|
|
|
Пожалуй, начну реализовывать свой алгоритм. Он, правда, экспоненциальной трудоемкости и по памяти, как минимум, полиномиальный.. но других пока все равно нет.
-юсртыхэю Цитата Flex Ferrum @ nvm, обрати внимание: Цитата Sazabis @ Каждая дорога - односторонняя, соединяет ровно два перекрестка Т. е. дорог, исходящих и из перекрестка и входящих в него же быть не может, а значит твой пример №2 не соответствует условиям задачи. Здесь не сказано "два различных перекрестка", поэтому перекресток может соединяться сам с собой. Хотя .."ровно два перекрестка" - так как дорогу, соединяющую три перекрестка, представить трудно, то наверное имелось в виду как раз отсутствие петель. Но в математическом плане фраза совершенно пустая (т.е. петли не исключает), и за такие формулировки составителей нужно дисквалифицировать. |
Сообщ.
#37
,
|
|
|
Цитата Flex Ferrum @ Кроме того, глубина поиска уменьшается за счет того, что при первом достижении целевого узла запоминается полученное время (для последующего отбора путей), и если при последующей обработке еще на "полпути" получается время, превышающее ранее зафиксированное, то дальнейшая обработка этого пути прекращается. хмм.. А вы учитываете, что можно приехать на перекресток со скоростью, большей, чем в предыдущий раз, но с небольшим опозданием ? С отсутсвием ограничения скорости на некоторых перекрестках, вы придете к неверному ответу, в частном случае. |
Сообщ.
#38
,
|
|
|
Цитата Sazabis @ хмм.. А вы учитываете, что можно приехать на перекресток со скоростью, большей, чем в предыдущий раз, но с небольшим опозданием ? С отсутсвием ограничения скорости на некоторых перекрестках, вы придете к неверному ответу, в частном случае. Ты меня, видимо, не совсем правильно понял. Вот смотри. Предположим, есть два возможных пути из А в D: (A B D) и (A C D). Алгоритм первый раз прошел через узел B и, добравшись до D, получил время, положим 10. После этого, идя по второму варианту пути (через C) он уже на узле C получил время 10. Есть ли, в таком случае, смысл продолжать этот путь дальше, если ранее полученное время заведомо никак не улучшится? Расстояния, ведь, ненулевые, а потому за нулевое время их преодолеть никак нельзя. Добавлено Кстати, нет ли у тебя файликов побольше? |
Сообщ.
#39
,
|
|
|
Цитата Sazabis @ Каждая дорога - односторонняя, соединяет ровно два перекрестка дороги из А в А не будет/(из 1 в 1)/петли Теперь, что касаеться импровизированого теста, на раскрутку тела. Момент, конечно интересный, НО задача из серии дейкстры, так что, можно сказать, в каждой вершине достаточно побывать 1 раз. Можем внести это в условие, если хотите. Так же, сами подумайте, какого черта ехать набирать скорость в 3 перекресток а потом возвращаться ? У нас же с Вами не космическая программа по разгону спутников по орбите ![]() |
Сообщ.
#40
,
|
|
|
Цитата Sazabis @ Теперь, что касаеться импровизированого теста, на раскрутку тела. Момент, конечно интересный, НО задача из серии дейкстры, так что, можно сказать, в каждой вершине достаточно побывать 1 раз. Можем внести это в условие, если хотите. Так же, сами подумайте, какого черта ехать набирать скорость в 3 перекресток а потом возвращаться ? У нас же с Вами не космическая программа по разгону спутников по орбите Поздняк метаться - я уже внес необходимые изменения в алгоритм ![]() Да и дейкстра тут далеко не в чистом виде. |
Сообщ.
#41
,
|
|
|
файлики побольше
![]() Flex, проверь свой алгоритм на 2 архиве Прикреплённый файл ![]() |
Сообщ.
#43
,
|
|
|
Цитата Sazabis @ Теперь, что касаеться импровизированого теста, на раскрутку тела. Момент, конечно интересный, НО задача из серии дейкстры, так что, можно сказать, в каждой вершине достаточно побывать 1 раз. Можем внести это в условие, если хотите. Нехорошо принципиально менять условие задачи через два дня после того, как она сформулирована. Добавлено Я бы сказал, что менять условие - ни в какие ворота не лезет (когда время потрачено на исходную задачу). Поэтому либо оставляем прежнее условие, где оптимальное решение может проходить дважды не только через вершину, но и через одну дугу, либо меняем секунданта (вместе с задачей). |
Сообщ.
#44
,
|
|
|
Цитата nvm @ Нехорошо принципиально менять условие задачи через два дня после того, как она сформулирована. я ничего не менял! это ты сам придумал. Я уже сказал, что у меня нет таких тестовых данных, чтобы проверять кольца. Однако ресурсоемкость очень возрастет, так что, если хотите, можете включить в тесты свой вариант, и фиксить кольца. Только ОБА либо фиксят кольца, либо не фиксят. Выбирайте сами, я на Вас не давлю. |
Сообщ.
#45
,
|
|
|
Цитата Sazabis @ Только ОБА либо фиксят кольца, либо не фиксят. Выбирайте сами, я на Вас не давлю. Я ссылок на возможность присутствия колец в условии задачи не нашел. ![]() |
Сообщ.
#46
,
|
|
|
Предлагаю вспомнить, как проходили задачи в C/C++: есть условие, есть автор условия. Если есть уточняющие задачу вопросы - спрашивайте. Вопросов нет - поехали.
![]() |
Сообщ.
#47
,
|
|
|
Поиск оптимального алгоритма в какой-то степени важен, ИМХО. Вот посмотрел код Flex Ferrum'a что то с трудом идет
![]() много чего не понятно, а в частности, как это вообще работает ![]() |
Сообщ.
#48
,
|
|
|
Цитата Sazabis @ много чего не понятно, а в частности, как это вообще работает Комментарии добавить? ![]() |
Сообщ.
#49
,
|
|
|
Цитата Flex Ferrum @ Комментарии добавить? конечно. Желательно еще обосновать выбор. Почему например используеться list а не stack(deque) ? а как вообще с тестами которые я выложил, работает верно ? |
Сообщ.
#50
,
|
|
|
Цитата Flex Ferrum @ Я ссылок на возможность присутствия колец в условии задачи не нашел. Ограничения принято указывать явно. А если ограничение не описано, то подразумевается, что его нет. Никаких намеков на то, что нельзя проезжать один перекресток дважды, не было. Цитата Мне кажется (что по этому поводу думают остальные?), что детали наподобия колец и возможности возврата в данном случае не существенны. Несущественны, если не требуют существенного изменения алгоритма. Но может быть, эта деталь меняет полиномиальность на неполиномиальность. Кстати, ты можешь доказать, что в отсутствии циклов твой алгоритм гарантирует находжение решения? Может статься, что Дейкстра тут вообще неприменим. Прицепи экзешник - попробую найти контрпример без циклов. |
Сообщ.
#51
,
|
|
|
Цитата nvm @ Ограничения принято указывать явно. А если ограничение не описано, то подразумевается, что его нет. Совершенно необязательно. Как правильно скзал trainer, если текст задания недоконца ясен - неясные моменты уточняют вопросами. В нашем случае на вопрос "обрабатывать ли кольца" и "обрабатывать ли возвраты" был получен ответ - "нет, не надо". |
Сообщ.
#52
,
|
|
|
Цитата Flex Ferrum @ Цитата nvm @ Ограничения принято указывать явно. А если ограничение не описано, то подразумевается, что его нет. Совершенно необязательно. Как правильно скзал trainer, если текст задания недоконца ясен - неясные моменты уточняют вопросами. В нашем случае на вопрос "обрабатывать ли кольца" и "обрабатывать ли возвраты" был получен ответ - "нет, не надо". Совершенно обязательно - это основополагающее соглашение, которое обязано соблюдаться в любом строгом изложении, в т. ч. в постановках задач. Текст задачи вполне ясен, и из него следует, что кольца допускаются. Здесь невозможны другие трактовки. |
Сообщ.
#53
,
|
|
|
Цитата nvm @ Текст задачи вполне ясен, и из него следует, что кольца допускаются. Из какой фразы это следует? |
Сообщ.
#54
,
|
|
|
Цитата Flex Ferrum @ Цитата nvm @ Текст задачи вполне ясен, и из него следует, что кольца допускаются. Из какой фразы это следует? Из отсутствия обратного утверждения. |
Сообщ.
#55
,
|
|
|
Цитата nvm @ Ограничения - вещь относительная. Например, ограничение скорости в 100 км/ч - это снизу или сверху? Ограничения принято указывать явно. А если ограничение не описано, то подразумевается, что его нет. ![]() Если не уточнил - будь уверен, ситуацию истолкуют не в твою пользу. ![]() ![]() |
Сообщ.
#56
,
|
|
|
Может в ТЗ и спецификациях сейчас и принято не оговаривать ограничения, но задачи должны соблюдать академическую культуру изложения.
|
Сообщ.
#57
,
|
|
|
Цитата nvm @ Из отсутствия обратного утверждения. В таком случае я склонен с тобою несогласиться. Ибо в этом случае я могу сказать: "в задаче не сказано, что нужно обрабатывать кольца. По этому я не буду их обрабатывать". И что будем делать? Правильно - спрашивать постановщика. Добавлено Цитата nvm @ Может в ТЗ и спецификациях сейчас и принято не оговаривать ограничения, но задачи должны соблюдать академическую культуру изложения. nvm, извини, ты слишком сильно заморочился. По твоей логике задачу "напишите мне программу, выводящую на экран строку "Hello World!"" надо начинать с разработки собственной ОС. Ибо в задаче не сказано обратного. Добавлено Цитата Sazabis @ а как вообще с тестами которые я выложил, работает верно Верно то оно верно, только вот speed4.in колбасила 10598406 msecs - почти 3 часа (правда, надо учесть, что с приоритетом "Low", т. к. паралельно и другими делами компьютер приходилось занимать). На ночь запущу speed8.in, а покуда подумаю над оптимизацией и сужением пространства поиска. ![]() ![]() |
Сообщ.
#58
,
|
|
|
Цитата Flex Ferrum @ Добавлено Цитата nvm @ Может в ТЗ и спецификациях сейчас и принято не оговаривать ограничения, но задачи должны соблюдать академическую культуру изложения. nvm, извини, ты слишком сильно заморочился. По твоей логике задачу "напишите мне программу, выводящую на экран строку "Hello World!"" надо начинать с разработки собственной ОС. Ибо в задаче не сказано обратного. Видно, что программисты хорошо насобачились истолковывать постановки в свою пользу.. Если в ТЗ сказано напечатать целые числа от 0 до 10, а заказчик, оказывается, имел в виду только четные - он должен принять работу, так как это доп. ограничение он в ТЗ не вписывал. Если в задаче говорится найти самый быстрый путь, то с какой стати ты предлагаешь не самый быстрый, утверждая, что именно это и имелось в виду?! |
Сообщ.
#59
,
|
|
|
Цитата nvm @ Если в задаче говорится найти самый быстрый путь, то с какой стати ты предлагаешь не самый быстрый, утверждая, что именно это и имелось в виду?! Никто не мешает использовать дополнительные знания о предметной области. Нам с тобой известно, что в тестовых файлах будут графы без колец и возвратов. Так зачем усложнять себе жизнь? ![]() Добавлено Цитата nvm @ Видно, что программисты хорошо насобачились истолковывать постановки в свою пользу.. Естественно. Ибо время - деньги. Можно потратить месяц на разработку программы, решающей общий случай и неделю - на программу, решающую частный случай. Если точно известно, что будут только частные случаи (и других не будет) - "зачем платить больше"? |
Сообщ.
#60
,
|
|
|
Цитата nvm @ Это ты перегибаешь. Заказчик хочет, чтобы были целые числа от 0 до 10, но не оговорил последовательность, то он может взять твою работу, а может и не взять, т.к. ему надо в виде 10-9-..-1-0. Для него это естественно, а для тебя - ограничение. Если в ТЗ сказано напечатать целые числа от 0 до 10, а заказчик, оказывается, имел в виду только четные - он должен принять работу, так как это доп. ограничение он в ТЗ не вписывал. В общем, фальстарт получился ![]() |
Сообщ.
#61
,
|
|
|
Цитата trainer @ Это ты перегибаешь. Заказчик хочет, чтобы были целые числа от 0 до 10, но не оговорил последовательность, то он может взять твою работу, а может и не взять, т.к. ему надо в виде 10-9-..-1-0. Для него это естественно, а для тебя - ограничение. Если ему нужен обратный порядок - то это с доплатой, как и за все, что не отражено в ТЗ. Цитата В общем, фальстарт получился ![]() Ну нет, вот решение (грубое и без оптимизации). ..Только, скорее всего, техническая оптимизация здесь даст малый эффект по сравнению с алгоритмической. Добавлено На примерах с циклами алгоритм правильно находит скорейший путь, правда, не выводит его полностью (только до пересечения) - небольшой баг. Добавлено Если добавить printf: ![]() ![]() bool GraphNode::draw_path(const GraphNode* next, double speed, double time) { ... m_next=next; printf("%i ",m_id); return true; ... } то будет выводить правильный путь на консоль. -юсртыхэю Цитата Flex Ferrum @ только вот speed4.in колбасила 10598406 msecs - почти 3 часа Так сделай не 10000 повторов, а меньше.. Прикреплённый файл ![]() |
Сообщ.
#62
,
|
|
|
..Баг с неточным восстановлением пути остался, но будет исправлен. Минимальное время вычисляется точно.
|
Сообщ.
#63
,
|
|
|
Цитата nvm @ только вот speed4.in колбасила 10598406 msecs - почти 3 часа на современных тачках тесты должны проходить за доли секунды ![]() ![]() ![]() Добавлено по индивидульной программе ![]() |
Сообщ.
#64
,
|
|
|
Цитата Sazabis @ на современных тачках тесты должны проходить за доли секунды на последнем тесте порядка секунды. так что если получаеться дольше, что то не правильно делаете. Работаем над техникой Ок. Буду иметь в виду. |
Сообщ.
#65
,
|
|
|
Цитата Sazabis @ на современных тачках тесты должны проходить за доли секунды ![]() После того факта, что в условии нет ограничения на повторное прохождение перекрестков, а в тестах соответствующие примеры отсутствуют, квалификация составителей этой задачи вызывает большие сомнения. Поэтому очень спорный вопрос, что здесь правильно. Может статься, полиномиального алгоритма не существует, даже при ограничении на самопересечения траектории. |
Сообщ.
#66
,
|
|
|
Цитата nvm @ После того факта, что в условии нет ограничения на повторное прохождение перекрестков, а в тестах соответствующие примеры отсутствуют, квалификация составителей этой задачи вызывает большие сомнения. А может говорить о том, что исполнитель задачи слишком заморачиваться... ![]() |
Сообщ.
#67
,
|
|
|
..Кстати, в условии сказано (1<=L<=500), а в тестах есть L=0.
|
Сообщ.
#68
,
|
|
|
Вот чисто работающий (после внесения исправления из поста 75) вариант, близкий к тому, чтобы быть финальным.
Технической оптимизации нет, но она и не даст большого эффекта на больших задачах. Алгоритмическая оптимизация - как бы не по существу спора. Прикреплённый файл ![]() |
Сообщ.
#69
,
|
|
|
Цитата nvm @ ..Кстати, в условии сказано (1<=L<=500), а в тестах есть L=0. Тебе условие дано, тесты это для упрощения, чтобы не заморачиваться созданием графов самому. Не понравился, тест не используй. Я посмотрел, там только в одном? эта "бага" ![]() Добавлено nvm, если в одном цикле объявил переменную, а в следующем используешь переменную с тем же именем, то борланд ругаеться. Объявляй их в каждом цикле, или до цикла. |
Сообщ.
#70
,
|
|
|
Цитата Sazabis @ nvm, если в одном цикле объявил переменную, а в следующем используешь переменную с тем же именем, то борланд ругаеться. Объявляй их в каждом цикле, Тогда VC6 не примет. Цитата или до цикла. Пожалуй, это лучший выход. Где не забуду, буду придерживаться. Добавлено Да, долго считает, на 9-й задаче уже полтора часа.. Зато какой простой алгоритм: ![]() ![]() static double precision=1E-10; bool GraphNode::find_solution(const GraphNode::Stat* parent, double speed, double time) { for (Stat* s=m_Stats; s; s=s->next) if (s->speed>=speed-precision && s->time<=time+precision) return true; // Pareto m_Stats=new Stat(m_Stats,*this,parent,speed,time); for (Arc* a=m_Arcs; a; a=a->next){ const double new_speed=a->speed>precision?a->speed:speed; if (new_speed<precision) throw("GraphNode::find_solution"); if (!a->end.find_solution(m_Stats,new_speed,time+a->distance/new_speed)) return false; } return true; } - Эта функция находит быстрейшие (возможно, циклические) пути ко всем вершинам. |
Сообщ.
#71
,
|
|
|
и вынеси дебаг из релиза, к чему столько файлов speed.log /speed.cmp.
на 5 задачке какой то цикл нашел, по времени одентичен оптимальному, а вот по пути.... Ты что, петли будешь фиксить ? после 5 теста, твоя игрушка накрываеться )), не знаю сколько ей время нужно на поиск. память плавно растет, но кодГвард вроде не ругаеться. в конце видать аккуратно чистишь, но в процессе ![]() |
Сообщ.
#72
,
|
|
|
Моя игрушка загнулась на 7-ом. Над чем-то думала 14 часов, после чего я ее срубил. А до этого результаты такие:
1. 0 1 4 3 Working time: 0 msecs. 2. 0 8 3 1 Working time: 0 msecs. 3. 0 18 1 Working time: 16 msecs. 4. 0 1 2 6 10 14 17 20 25 30 35 39 41 45 48 52 57 62 66 70 74 78 81 86 90 94 99 Working time: 3428797 msecs. 5. 0 12 5 14 15 27 26 29 30 41 40 38 44 45 58 49 54 59 60 73 74 75 89 Working time: 14953 msecs. 6. 0 53 16 35 40 1 Working time: 3110 msecs. |
Сообщ.
#73
,
|
|
|
Цитата nvm @ m_Stats=new Stat(m_Stats,*this,parent,speed,time); может где то в глубине твоих классов ты и убиваешь это, но явно не понятно где ![]() |
Сообщ.
#74
,
|
|
|
Цитата Sazabis @ Цитата nvm @ m_Stats=new Stat(m_Stats,*this,parent,speed,time); может где то в глубине твоих классов ты и убиваешь это, но явно не понятно где ![]() В деструкторе, конечно. Расход памяти умышлен и оправдан - это сокращает перебор. -юсртыхэю Цитата Sazabis @ на 5 задачке какой то цикл нашел, по времени одентичен оптимальному, а вот по пути.... Путь что-то не тот выдает - и это теперь очень странно, так как на других примерах все нормально. Цитата Ты что, петли будешь фиксить ? Нет. Если оптимальный путь содержит петли, то он уже и так находится. Добавлено 9-й пример все же досчитался (2,5 часа). Быстрейшее время: best_time=1.20745 (last_speed=413). Но с путем опять проблемы. |
Сообщ.
#75
,
|
|
|
Нашел ошибку:
![]() ![]() bool GraphNode::find_solution(const GraphNode::Stat* parent, double speed, double time) { if (parent && parent->time>time+precision) throw("GraphNode::find_solution"); for (Stat* s=m_Stats; s; s=s->next) if (s->speed>=speed-precision && s->time<=time+precision) return true; // Pareto m_Stats=new Stat(m_Stats,*this,parent,speed,time); Stat* new_parent=m_Stats; // avoid recursive spoiling for (Arc* a=m_Arcs; a; a=a->next){ const double new_speed=a->speed>precision?a->speed:speed; if (new_speed<precision) throw("GraphNode::find_solution"); if (!a->end.find_solution(new_parent,new_speed,time+a->distance/new_speed)) return false; } return true; } - Теперь работает правильно. Добавлено Sazabis, а у тебя есть "эталонный" алгоритм решения задачи (тот, который использовался при просчете тестов) ? Добавлено Пример 7 просчитала за пол-часа, траектория правильная. Добавлено Flex Ferrum, ты, наверное, жестко ограничиваешь использование памяти? |
Сообщ.
#76
,
|
|
|
Цитата nvm @ Flex Ferrum, ты, наверное, жестко ограничиваешь использование памяти? Да. Пока что память используется по минимуму. Но это ненадолго. ![]() |
Сообщ.
#77
,
|
|
|
Цитата Flex Ferrum @ Цитата nvm @ Flex Ferrum, ты, наверное, жестко ограничиваешь использование памяти? Да. Пока что память используется по минимуму. Но это ненадолго. ![]() Ничего, я тоже оставил резерв для будущей оптимизации ![]() Добавлено А ты усложнения внес только, чтобы ловить циклы, или обнаружил, что алгортм Дейкстры в непосредственном виде неприменим и без циклов? Добавлено Вроде бы Дейкстра не должен сработать на таком примере: 6 6 5 0 1 110 120 0 2 100 100 1 3 0 120 2 3 0 100 3 4 0 150 4 5 0 150 |
Сообщ.
#78
,
|
|
|
Цитата nvm @ А ты усложнения внес только, чтобы ловить циклы, или обнаружил, что алгортм Дейкстры в непосредственном виде неприменим и без циклов? Посуди сам. Алгоритм Дейкстры основан на том предположении, что веса ребер и дуг фиксированы, а потому мы действительно можем уложиться во время O(n2). В нашем случае ситуация осложняется тем, что, как правильно заметил Sazabis, мы можем придти в какую-то из вершин графа с "оставанием" от предыдущего резульата, но на большей скорости. Таким образом получается, что вектор минимальных "расстояний" в чистом виде не применим, а вместе с ним и весь Дейкстра. |
Сообщ.
#79
,
|
|
|
Цитата Flex Ferrum @ Таким образом получается, что вектор минимальных "расстояний" в чистом виде не применим, а вместе с ним и весь Дейкстра. Ну это вы загнули. Просто тут в качестве метки вершины надо использовать не метку (был/небыл) а пару (время/скорость) и, как я подумал по дороге на работу, еще и метку "проехал" или нет. Тоесть если добавить метку "уже проехал" помимо (время/скорость), то НЕ получим фиксирование циклов, а если эту метку убрать, то получим нахождение с учетом "разгонных" циклов. Цитата nvm @ Sazabis, а у тебя есть "эталонный" алгоритм решения задачи (тот, который использовался при просчете тестов) ? эталона нету, могу положить свой .exe, без кода, так как он ужасен )) , я писал на время. Если в выходные будет время подредактирую выложу код. |
Сообщ.
#80
,
|
|
|
смотрите на время и память.
Прикреплённый файл ![]() |
Сообщ.
#81
,
|
|
|
Цитата Sazabis @ Просто тут в качестве метки вершины надо использовать не метку (был/небыл) а пару (время/скорость) и, как я подумал по дороге на работу, еще и метку "проехал" или нет. Тоесть если добавить метку "уже проехал" помимо (время/скорость), то НЕ получим фиксирование циклов, а если эту метку убрать, то получим нахождение с учетом "разгонных" циклов. Я пришел к аналогичному выводу. Но квадратичной сложности все равно не получится, ибо если мы входим на перекресток с большей скоростью, то мы обязаны обойти все дуги с 0-ой меткой скорости. |
Сообщ.
#82
,
|
|
|
Цитата Flex Ferrum @ Посуди сам. Алгоритм Дейкстры основан на том предположении, что веса ребер и дуг фиксированы, а потому мы действительно можем уложиться во время O(n2). Потому меня с самого начала и удивило твое утверждение об использовании Дейкстры. Мне задача представляется полиномиально неразрешимой, поэтому я сразу затеял использовать рекурсивный алгоритм. -юсртыхэю Цитата Sazabis @ .. без кода, так как он ужасен )) Не стесняйся - все свои ![]() ..Екзешник в 300кб - это тоже ужасно (в данном случае). -юсртыхэю Цитата Flex Ferrum @ Я пришел к аналогичному выводу. Но квадратичной сложности все равно не получится, ибо если мы входим на перекресток с большей скоростью, то мы обязаны обойти все дуги с 0-ой меткой скорости. Если комбинировать идею Дейкстры с ограниченным перебором, то, наверное, можно сильно ускорить поиск, но алгоритм получается сильно "развесистый". ..Как-то лень связываться с алгоритмической оптимизацией, но если напишешь более быстрый вариант, то и мне придется. |
Сообщ.
#83
,
|
|
|
Цитата nvm @ Екзешник в 300кб - это тоже ужасно (в данном случае). оттуда можно много выкинуть ![]() ![]() Добавлено Цитата nvm @ Если комбинировать идею Дейкстры с ограниченным перебором, то, наверное, можно сильно ускорить поиск, но алгоритм получается сильно "развесистый". блин ![]() Добавлено у nvm выделение памяти через new прямо в рекурсивном цикле, нельзя было за ранее чтоли продумать. Там столько вызовов этой процедуры на большом графе. |
Сообщ.
#84
,
|
|
|
Цитата Sazabis @ Ну это вы загнули. Просто тут в качестве метки вершины надо использовать не метку (был/небыл) а пару (время/скорость) Да даже если и так - по каким криетриям сравнивать эту пару? По каким критериям выбирать очередной узел (если использовать идею Дейкстры)? По минимальному времени? По максимальной скорости? Добавлено Цитата Sazabis @ блин сделайте сортировку, ( вроде ее у вас не видно ) Ничего там развесистого нету. Сделал. И что? 0-ые дуги помещаются вначало (отсортированные по расстоянию), помеченные - в конец. |
Сообщ.
#85
,
|
|
|
Цитата Sazabis @ блин ![]() Пока мой алгоритм быстрее, чем у Flex Ferrum-а, нет стимула модернизировать. Цитата у nvm выделение памяти через new прямо в рекурсивном цикле, нельзя было за ранее чтоли продумать. Там столько вызовов этой процедуры на большом графе. Выделение памяти обычно первый кандидат на оптимизацию (тем более, когда 100Мб выделяются кусочками по 30б), но пока, как ни странно, не это узкое место (скорость приращения используемой программой памяти существенно падает со временем, что означает, что не в памяти дело). |
Сообщ.
#86
,
|
|
|
Цитата Flex Ferrum @ Сделал. И что? 0-ые дуги помещаются вначало (отсортированные по расстоянию), помеченные - в конец. имхо, сортировка ветвей должна быть по времени при попадании в узел. А не один раз в начале. Это же эвристический показатель крутости ветви. Он постоянно меняеться в зависимости от того, когда вы пришли в узел. Двигаясь сразу по наиболее быстрой траектории мы получаем давольно сностное время прохождения, которое потом нам поможет отсеить большенство ветвей еще на середине прохождения. Можно сортировать по скорости, опять таки при попадании в узел. На разных задачках эти два подхода обратно пропорциональны. Можно конечно коэфициэнт крутости взять исходя из скорости (некий знак, +,* ...) времени прохождения. Но если сортировать по времени, по на больших графах получаете выйгрыш при выходе из цикла по первому достижению макс времени, без сортировки вам приходиться проверять весь граф. Не считаю ЭТО алгоритмической трудностью, это естественный подход для решения подобной задачи. Надо еще заметить, что я был в курсе, что придеться сортировку реализовывать ![]() |
Сообщ.
#87
,
|
|
|
Новая версия программы для демонстрации бесполезности stl+boost.
Время работы на всех задачах меньше секунды. Код не до конца причесан, но бывает хуже. Прикреплённый файл ![]() |
Сообщ.
#88
,
|
|
|
![]() а, nvm, причеши пока свой код, и пояснения к алгоритму напиши, а то крыша едет. |
Сообщ.
#89
,
|
|
|
Цитата Sazabis @ Ждемсъ Flex Ferrum. Блин. У меня засада - не могу догнать идею алгоритма. ![]() |
Сообщ.
#90
,
|
|
|
Цитата Sazabis @ а, nvm, причеши пока свой код, и пояснения к алгоритму напиши, а то крыша едет. Пояснения напишу, а причесывать - не уверен в целесообразности, так как вряд ли его кто будет использовать, а общая идеология и так понятна. ..Свой вариант все же тоже выложи. |
Сообщ.
#91
,
|
|
|
Фуф. Ну все. Завтра покупаю себе питальник (в комп), и наконец-то добью задачу.
|
Сообщ.
#92
,
|
|
|
хм... Ну так что ? Наичистейший С++ победил ?
![]() |
Сообщ.
#93
,
|
|
|
Цитата Sazabis @ хм... Ну так что ? Наичистейший С++ победил ? Я же написал чуть выше - Цитата Flex Ferrum @ Блин. У меня засада - не могу догнать идею алгоритма. Т. е. у меня проблема в идее алгоритма, а не в его реализации. Мало я с графами работал. Сравнивал работу моего варианта и варианта nvm'а - не могу догнать, за счет чего nvm'овский вариант настолько сужает пространство поиска. ![]() ![]() ![]() ![]() Могу поступить, гм, таким образом - взять nvm'овский вариант и один-в-один переложить его на STL+boost. Вопрос - будет ли это засчитано как решение ![]() |
Сообщ.
#94
,
|
|
|
Цитата Flex Ferrum @ Могу поступить, гм, таким образом - взять nvm'овский вариант и один-в-один переложить его на STL+boost. Вопрос - будет ли это засчитано как решение . Flex Ferrum, nvm, напишите, ваши алгоритмы в псевдо коде или лучше словами. Так как функция, имхо, рекурсивная то получиться не много. Посмотрим и сразу все видно будет. А один в один перекладывать, имхо, будет нечестно. nvm писал выше, что алгоритм рабочий, но "причесывать" его он не стал, если ты переложишь его алгоритм, то как бы "причешишь" код и твой будет лучше. |