Стандартно: подскажите пожалуйста, как решать задачу С.
И N.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Название |
---|
Ориентируем в исходном графе все ребра таким образом: из вершины с меньшим номером в вершину с большим. Гамильтонов цикл, описанный в условии, будет существовать в исходном графе тогда и только тогда, когда в построенном орграфе существует два непересекающихся по вершинам (за исключением конечной и начальной) пути из вершины 1 в вершину n суммарной длины n (в смысле числа ребер). Два описанных пути (при этом кратчайшей длины (в исходном смысле длины)) ищем так: строим сеть, в которой:
- исток - 1 вершина, сток - вершина n
- вершины исходного графа раздвоены (стандартно, для исключения пересечений по вершинам)
- стоимости протекания по дугам назначены следующим образом: пара (-1,с), где с - длина соответствующего ребра в исходном графе, между раздвоенными вершинами - пара (0,0)
В такой сети ищем поток величины 2 и минимальной стоимости. Если найденный поток меньше 2, или первая координата стоимости больше -n, говорим "NIE", иначе ответ - вторая координата стоимости.
Поток мощности два - дает два непересекающихся пути. То, что мы ищем поток минимальной стоимости должно давать:
- пути суммарной длины n (в смысле числа входящих в них дуг), если такие существуют (пары сравниваются начиная с первой координаты)
- среди всех таких, пути минимальной суммарной длины (в смысле исходной задачи)
// Вместо стоимостей-пар, пробовал стоимости-числа, получаемые так -M+w, где
M - число большее, чем сумма длин всех ребер
w - длина исходного ребра
Это должно работать так же, как стоимости-пары: приоритет отдается числу входящих в путь ребер, на втором месте - суммарная длина пути (как сумма длин ребер входящих в путь).
2. Заметить, что памяти для нее достаточно 26^2
3. Заметить, что переход теперь делается за 26
Вроде было объявлено, что после закрытия V Кубка Векуа результаты появятся. Но по расписанию уже больше суток прошло. Правда, перед этим товарищеский ужин, и я допускаю, что, с учетом грузинского гостеприимства, он очень затянулся =)
P.S. Правда G, по словам Гены, он пропихнул на чистой эвристике.
P.P.S. Гена-то сейчас в Минске на сборах, это он мне по телефону рассказал.
Как я понимаю, это не к Вам вопрос, но кто-то ответ энает. Автора!
________________________________________________
Да, конечно. Но, возможно, я объясняю недостаточно хорошо, но думаю идея будет понятна.
Основная идея решения - это сканирующая прямая, которая вращается вокруг точки. Будем для каждой точки поддерживать какую-то прямую, которая через нее проходит. При этом все такие прямые на начальном этапе параллельны (можно сделать вертикальными или горизонтальными). Также мы будем поддерживать порядок этих прямых (к примеру, справа налево). Это нам понадобится, чтобы искать ближайшую прямую. Как использовать эту информацию для решения? Событиями здесь будут те моменты, когда прямые для двух различных точек совпадают. Тогда в такой момент нам нужно просто найти ближайшую прямую к данной, и попробовать составить треугольник из точки на ближайшей прямой и двух точек, для которых совпадают прямые. Вот так проходим по всем событиям и ищем каждый раз треугольник минимальной площади. При этом следует заметить, что при каждом событии, порядок прямых не сильно меняется - соседние прямые могут поменяться местами.
Вроде как где-то такое или похожее решение обсуждалось после Опенкапа годичной давности, но где, к сожалению, не помню...