[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!

Check this out!

Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 104 | 6 | 8
Назад Вниз Каталог Обновить

Аноним 19/03/17 Вск 15:48:56  149143990  
2017-03-19 15.4[...].png (13Кб, 753x392)
Привет, аноны, я снова здесь, чтобы просить у вас помощи. Я уже две недели ебусь с задачей на графы. Десять дней назад я создавал тред, где анон написал, что нужно сделать граф блоков и точек сочленения. С точками сочленения проблем нет, но с блоками - это пиздец. В интернете тупо нету кода, который ищет их. Есть инструкции и объяснения. Я перепробовал их все, но они ТУПО НЕ РАБОТАЮТ. Просто блять не работают, я не знаю почему. Сделав 1 в 1 как в инструкции, я обнаруживаю какой-нибудь баг, потом исправляю его, появляются ещё и ещё, и я понимаю, что это не инструкция а хуета полная. Что это блять за инструкция, сделав которую, нихуя не работает??? Так вот, я прошу у вас хоть как-то помочь мне с кодом поиска блоков в графе. В идеале конечно, чтобы вы его написали, потому что я заебался по инструкциям работать, меня уже трясёт всего.

Вот текст из прошлого треда:
Есть тут аноны, разбирающиеся в графах? Есть задача, бьюсь над ней уже третий день. Мне дают неориентированный граф, не содержащий петель и кратных ребер. Также мне дают некоторое количество пар вершин. Мне нужно найти кол-во точек сочленения в диапазоне этих вершин, не считая начальной и конечной вершины.

Вот строчка из оригинального текста(вы поймете, зачем я её вставил сюда): Для каждой описанной пары выведите на отдельной строке единственное число —- количество вершин c, таких, что любой путь из ai в bi, проходит через c

Привожу пример:
1. Мне даётся пкрл граф и одна пара(1, 5). Точки сочленения между этими вершинами - это 2 и 3, значит ответ - 2(две вершины).
2. Тот же граф, но пара (9, 7). Программа должна вывести 0, т.к. нету такого пути из 9 в 7, чтобы он проходил постоянно по одной и той же вершине(точка сочленения есть, но вершины такой нет, так что можно сказать, что это частный случай).

С нахождением точек сочленения проблем нет, но я не знаю, как вычленить из графа именно нужный мне путь. То что делается это всё поиском в глубину, я думаю, это ясно. Так вот если ввести 9 и 7, то поиск пойдёт от 1 до 6, посчитает точки сочленения, это (1, 2, 3), вернётся в единицу, пробежит 7, 8 и 9 и выдаст мне ответ 3, т. к. он пробежит весь граф, а мне нужен диапазон именно от 9 до 7, чтобы оно не ходило по лишним вершинам.

К слову, подразумевается, что всё это можно сделать только поисками в глубину.
Аноним 19/03/17 Вск 15:49:39  149144041
Буду бампать, пока не здохну, мне уже нечего терять.
Аноним 19/03/17 Вск 15:50:47  149144130
Бамп
Аноним 19/03/17 Вск 15:51:05  149144155
Бамп
Аноним 19/03/17 Вск 15:51:25  149144179
Бамп
Аноним 19/03/17 Вск 15:52:11  149144232
Бамп
Аноним 19/03/17 Вск 15:52:28  149144254
Бамп
Аноним 19/03/17 Вск 15:53:01  149144303
Бамп
Аноним 19/03/17 Вск 15:53:27  149144324
Бамп
Аноним 19/03/17 Вск 15:53:46  149144344
Бамп
Аноним 19/03/17 Вск 15:54:03  149144370
Бамп
Аноним 19/03/17 Вск 15:54:20  149144390
Бамп
Аноним 19/03/17 Вск 15:54:47  149144426
Бамп
Аноним 19/03/17 Вск 15:55:08  149144443
Бамп
Аноним 19/03/17 Вск 15:55:45  149144480
Бамп
Аноним 19/03/17 Вск 15:56:05  149144518
Бамп
Аноним 19/03/17 Вск 15:57:16  149144599
Бамп
Аноним 19/03/17 Вск 15:57:46  149144640
Бамп
Аноним 19/03/17 Вск 15:58:02  149144654
Бамп
Аноним 19/03/17 Вск 15:58:19  149144673
Бамп
Аноним 19/03/17 Вск 15:58:48  149144710
Бамп
Аноним 19/03/17 Вск 15:59:14  149144745
Бамп
Аноним 19/03/17 Вск 15:59:30  149144763
Бамп
Аноним 19/03/17 Вск 16:00:07  149144807
Бамп
Аноним 19/03/17 Вск 16:00:52  149144869
Бамп
Аноним 19/03/17 Вск 16:01:15  149144894
Бамп
Аноним 19/03/17 Вск 16:01:39  149144928
Бамп.
Аноним 19/03/17 Вск 16:02:08  149144973
Бамп
Аноним 19/03/17 Вск 16:02:27  149144991
Бамп
Аноним 19/03/17 Вск 16:02:47  149145016
Бамп
Аноним 19/03/17 Вск 16:03:16  149145052
Бамп
Аноним 19/03/17 Вск 16:03:55  149145102
Бамп
Аноним 19/03/17 Вск 16:04:11  149145118
Бамп
Аноним 19/03/17 Вск 16:04:32  149145140
Бамп
Аноним 19/03/17 Вск 16:05:14  149145191
В матрицах смежности там все пральна считается ?
Аноним 19/03/17 Вск 16:07:25  149145339
Ищешь тем же DFSом от 1 вершины, но как только доходишь до 2, стопаешься. Вроде всё.
Аноним 19/03/17 Вск 16:07:38  149145352
>>149145191
Да похуй на способ представления графа. Я использую матрицу, т к. там доступ к ребру О(1)
Аноним 19/03/17 Вск 16:07:53  149145371
>>149145191
Или это не задача коммивояжера, выкачусь пожалуй нахуй
Аноним 19/03/17 Вск 16:08:13  149145403
>>149145339
Ты хоть читал оп пост?
Аноним 19/03/17 Вск 16:09:24  149145487
Бамп(((( сука((( в тот раз аноны умнее были((
Аноним 19/03/17 Вск 16:09:41  149145516
Вбпмр
Аноним 19/03/17 Вск 16:10:11  149145559
>>149145352
Нет, не похуй. Матрица -- O(n^2), список смежности -- O(n+m), если нужен доступ к ребру за быстро, пишешь хэшсетом.
Аноним 19/03/17 Вск 16:10:34  149145580
Бамп
Аноним 19/03/17 Вск 16:12:28  149145714
>>149145403
Да, тебе нужно найти количество точек, разделяющих A и B в разные компоненты.
Аноним 19/03/17 Вск 16:12:46  149145731
>>149145559
В задаче максимум вершин 400, так что лишние операции, которые дает матрица незначительны. Я планировал часто обращаться к ребру, вот и сделал ее.
Аноним 19/03/17 Вск 16:14:16  149145824
>>149145714
Я полторы недели назад тоже так думал. Если путь просто проходит через точку сочленения - это совсем не значит, что это нужный мне путь
Аноним 19/03/17 Вск 16:14:55  149145864
Бамп
Аноним 19/03/17 Вск 16:15:21  149145887
Бамп
Аноним 19/03/17 Вск 16:15:38  149145905
Бамп
Аноним 19/03/17 Вск 16:15:54  149145918
Бамп
Аноним 19/03/17 Вск 16:16:10  149145940
Бамп
Аноним 19/03/17 Вск 16:16:26  149145954
Бамп
Аноним 19/03/17 Вск 16:16:42  149145979
Бамп
Аноним 19/03/17 Вск 16:16:58  149145998
Бамп
Аноним 19/03/17 Вск 16:17:15  149146018
Бамп
Аноним 19/03/17 Вск 16:17:31  149146031
Бамп
Аноним 19/03/17 Вск 16:17:48  149146052
Бамп
Аноним 19/03/17 Вск 16:18:05  149146070
Бамп
Аноним 19/03/17 Вск 16:18:22  149146083
Бамп
Аноним 19/03/17 Вск 16:18:46  149146112
Бамп
Аноним 19/03/17 Вск 16:19:04  149146126
Бамп
Аноним 19/03/17 Вск 16:19:20  149146142
Бамп
Аноним 19/03/17 Вск 16:19:38  149146158
Бамп
Аноним 19/03/17 Вск 16:19:47  149146171
>>149145824
Ладно, я проебался, сейчас ещё подумаю.
Аноним 19/03/17 Вск 16:19:54  149146177
Бамп
Аноним 19/03/17 Вск 16:20:33  149146217
>>149146171
Буду ждать
Аноним 19/03/17 Вск 16:21:00  149146239
Бамп
Аноним 19/03/17 Вск 16:21:11  149146248
oekaki.png (17Кб, 400x400)
>>149143990 (OP)
Я не понял в чем твоя проблема.
Ищешь все пути из a в b(раз не сказано, что нужен кратчайший), если в одном из них есть номер, равный числу пройденных вершин, то его выводишь, иначе 0.
Или я ебусь в глаза и не понял суть задачи.

А вообще, дай ссылку на задачу.
Аноним 19/03/17 Вск 16:21:16  149146255
Бамп
Аноним 19/03/17 Вск 16:22:19  149146322
>>149143990 (OP)
Если я понял правильно, тебе надо
1 Найти сильно связные компоненты (http://e-maxx.ru/algo/connected_components) . Таким образом ты разметишь вершины по компонентам
2 Просто запускать dfs из вершины ai до bi и считать количество вершин на пути, которые лежат в разных компонентах связности
Кажется, всё. Или я не понял условие
Аноним 19/03/17 Вск 16:22:31  149146338
>>149146248
http://informatics.mccme.ru/mod/statements/view.php?id=15342#1
Аноним 19/03/17 Вск 16:23:21  149146400
>>149146322
просто компоненты связности, это ж не орграф

самофикс
Аноним 19/03/17 Вск 16:25:37  149146533
>>149146400
А если у меня граф - это одна большая компонента связности?
Мне нужны именно компоненты ДВУСВЯЗНОСТИ.
Аноним 19/03/17 Вск 16:26:35  149146595
Бамп
Аноним 19/03/17 Вск 16:27:22  149146647
Бамп
Аноним 19/03/17 Вск 16:28:13  149146702
Я чёт нихуя не понял.
Разве не получится:
1) Найти все пути.
2) Посмотреть, есть такие вершины, которые находятся в каждом пути.
3) Посчитать их.

Твоя описание задачи - какое-то кривое говно.


Аноним 19/03/17 Вск 16:29:26  149146768
>>149146702
джвачую
Аноним 19/03/17 Вск 16:30:41  149146859
>>149146248
>Ищешь все пути
И как я это реализую? Что принимать за путь? Путь, который отличается на одну вершины от другого - это новый путь?
>в одном из них есть номер, равный числу пройденных вершин
Тут не понял, в пути есть номер, равный числу пройденных вершин?
Аноним 19/03/17 Вск 16:32:17  149146963
>>149146702
Я так тоже думал, но отмел этот вариант, уже не помню почему. Объясни, как я буду искать пути
Аноним 19/03/17 Вск 16:32:33  149146979
Бамп
Аноним 19/03/17 Вск 16:32:49  149147002
Бамп
Аноним 19/03/17 Вск 16:33:07  149147031
Бамп
Аноним 19/03/17 Вск 16:35:17  149147156
Бамп
Аноним 19/03/17 Вск 16:37:40  149147316
Бамп
Аноним 19/03/17 Вск 16:39:11  149147424
>>149146963
>Объясни, как я буду искать пути
Я не смогу тебе сейчас назвать какой-то супероптимальный алгоритм, так как ничего сложнее Дейкстры мне не приходилось реализовывать, но это можно сделать даже просто обходом в ширину/глубину, удаляя с конца вершины, которыми воспользовался или типа того.

По-моему, это должно сработать. Проблема может только быть в том, что там сложность будет неебическая. А может и нет.
Аноним 19/03/17 Вск 16:44:30  149147771
>>149147424
Я вспомнил, как я делал. Первым дфсом я нашел путь к второй вершине, потом нашел точки сочленения. И начал по одной удалять точки сочленения, которые есть в этом пути, и, если я удалил точку и поиск в глубину не добрался до второй вершины, то эта точка - нужная мне вершина. Программа не уложиась в ограничение по времени.
Аноним 19/03/17 Вск 16:46:23  149147889
oekaki.png (17Кб, 400x400)
>>149146859
> И как я это реализую?
Строишь дерево. глубиной в число вершин(больше нет нужды). Заканчиваешь ветку в случае, если пришел в b. Потом все ветки которые не заканчиваются b отсекаешь.
Аноним 19/03/17 Вск 16:46:49  149147914
oekaki.png (17Кб, 400x400)
Вот пик к >>149147889
Аноним 19/03/17 Вск 16:47:32  149147967
Untitled.png (36Кб, 1372x607)
Ебаная макаба.
Вот пик к >>149147889
Аноним 19/03/17 Вск 16:49:09  149148074
>>149147771
Вот, можешь как он делать. >>149147967
Потом смотришь какие вершины одинаковые. Я почти уверен, что ты какое-то говно накодил просто.
Аноним 19/03/17 Вск 16:53:45  149148326
>>149147967
>>149147889
>>149148074
И как мне сделать, так чтобы оно могло несколько раз проходить через вершину 4? Просто массив used использовать не получиться, потому что, забраковав четвёрку, мы не сможем пройти как минимум один путь.
Аноним 19/03/17 Вск 16:58:56  149148687
>>149148326
Лол, да как угодно. Можешь свой класс реализовать, можешь массивами. Как тебе удобно.
Аноним 19/03/17 Вск 17:02:38  149148911
>>149148687
Я не про реализацию, а про идею. Я просто не могу догнать, что нужно сделать, чтобы он не ходил по одному и тому же пути. Первое решение, что приходит на ум - это массив used, где индексы - вершины, а true/false - посещена вершина или нет. Но если так сделать, то после прохода через четвёрку, она заблокируется, и тогда один из путей (1, 4, 5, 6, 7) или (1, 4, 6, 7) не будет пройден. Понимаю, что сейчас жёстко туплю, но у меня уже сил нету
Аноним 19/03/17 Вск 17:06:42  149149171
>>149143990 (OP)
Алгоритм Дейкстры же. Че ты как клоун.
Например пара (1, 5):
Для каждой точки ставишь минимальное количество шагов до точки 1(то до старта)
7 - 1 шаг
8 - 2 шага
9 - 1 шаг
2 - 1 шаг
3 - 2 шага
5 - 3 шага
6 - 3 шага
4 - 3 шага

Дальше берешь конечную точку 5 и смотришь веса его соседей:
3 - 2 шага
6 - 3 шага
4 - 3 шага
Берем минимальный из них и если он такой только один, то выводим его, иначе 0.

Пример для (9,7)
8 - 1 шаг
1 - 1 шаг
7 - 2шага
....
Смотрим соседей конечного узла (7):
8 - 1 шаг
1 - 1 шаг
Получается есть два минимальных пути, значит выводим 0.

Надеюсь понятно?
Аноним 19/03/17 Вск 17:13:51  149149590
>>149149171
Понятно. Выглядит безумно круто, даже настолько, что не верится, что это правда. Объясню почему:
1. Задача в разделе под названием "Поиск в глубину". Подразумевается, что она решается только поисками в глубину и его модификациями.
2. Ограничение на задаче 2 сек. Твой вариант слишком быстрый.
Если он >>149147967 не объяснит мне, как делать его способом, то, скорее всего, буду пробовать твой.
Аноним 19/03/17 Вск 17:16:09  149149726
бамп
Аноним 19/03/17 Вск 17:17:06  149149792
>>149149590
Да это и есть поиск в глубину. Просто надо ставить весь для каждой вершины при обходе. Если он и так меньше, то прерывать обход. Это и есть алгоритм Дейкстры.
Аноним 19/03/17 Вск 17:21:13  149150035
14899277367530.png (20Кб, 753x392)
>>149149792
Я придумал котртест на твой пример.
Аноним 19/03/17 Вск 17:22:48  149150131
>>149150035
А что не так? Должно работать
3 - 2 шага
4 - 3 шага
11 - 4 шага
Минимальный 2. Значит ответ 2.
Аноним 19/03/17 Вск 17:26:17  149150344
>>149150131
Чёрт, не заметил. Похоже ты прав. Тогда тут удобнее BFSом шаги выставлять, нет?
Аноним 19/03/17 Вск 17:28:44  149150497
>>149150344
Ну дейкстра вроде как в ширину обходит. Но ты можешь и в глубину сделать. По идее это медленее будет, но тоже уложится в 2 сек. Главное отсекать пути(если у точки меньше вес) и не попадать в циклы.
Аноним 19/03/17 Вск 17:34:34  149150831
>>149150497
>отсекать пути
Можно тут объяснить?
>не попадать в циклы
Ну тут же просто массив used, не?
Аноним 19/03/17 Вск 17:41:34  149151291
>>149150831
Если будешь делать в ширину, то все ок. Если в глубину, то может быть такая ситация :
1->2->3->4->5->11->10
у 11 будет 5 шагов, а у 10 6 шагов. Их нельзя помечать used, так как есть более короткий путь.
С другой стороны ты можешь попасть на точку 11, для который уже стоит мин вес 4, а твой текущий вес для нее 6. Значит надо прерывать этот обход. Потому что все остальные пути будут только увеличиваться и точно не будут минимальными. Ну и в цикл можно попасть. Короче условие прерывания обхода вес ноды < текущего веса.
Аноним 19/03/17 Вск 17:52:59  149152022
>>149151291
Все, я понял. Спасибо большое. Может напишешь свое мыло, я тогда результат тебе отправлю, когда напишу, вдруг не пойдет решение?Если откажешься, я пойму
Аноним 19/03/17 Вск 18:05:29  149152782
бмп(жду анона)

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 104 | 6 | 8
Назад Вверх Каталог Обновить

Топ тредов
Избранное