![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Zenon |
![]()
Сообщение
#1
|
Гость ![]() |
Здравствуйте.
Поставили перед нами такую задачe. Дано n кубиков домино, как известно они имеют номера с двух сторон, но в задаче сказано, что для данного случая они не ограничены цифрой 6, т.е. значения с обеих сторон могут быть боле 6, например 16 и 12 и т.п. (какие - то разумные пределы конечно есть, но просто больше чем в настоящих, т.е. чем 6). Задние состоит в том, чтобы найти самую длинную замкнутую цепочку.... Если честно теряюсь в догадках и по вопросу алгоритма и по вопросу реализации.... Надеюсь на Вашу помощь. |
Michael_Rybak |
![]()
Сообщение
#2
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Для перебора может быть полезен критерий: в графе существует эйлеров цикл (цикл, проходящий через все ребра ровно 1 раз) тогда и только тогда, когда 1) он связный и 2) все вершины имеют четную степень (т.е. четное количество инцидентных ребер).
Получается, нам нужно удалить как можно меньше ребер, не потеряв при этом связности, и добившись четности всех вершин. Также легко показать, что количество нечетных вершин всегда четно. При этом, если граф изначально несвязный, рассматриваем каждую компоненту связности отдельно. EDIT: удалил неправильные мысли Сообщение отредактировано: Michael_Rybak - 9.10.2006 10:31 |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Ну, поскольку ты не написал, на каком языке тебе нужно решение - вот так программа выглядит на Паскале (если костяшек больше 28, измени MAX)...
{$M $C000,0,650000} При исходном файле Цитата 5 1 2 1 3 2 16 3 6 5 16 Программа вывела результат: Цитата 5 <5 16> : <16 2> : <2 1> : <1 3> : <3 6> Тестируй... |
Гость |
![]()
Сообщение
#4
|
Гость ![]() |
Извини не подскажешь решение этой задачи на Си, а то я чувствую, что не переведу сам....
|
Nucris |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
2volvo
Понимаешь (ничего, что на ты?) дело в том, что у нас по самому Си пары 4 прошло, а вот графами даже не пахнет.... я понять немогу на кого расчитаны эти задания.... 2Michael_Rybak Примерно понятно, но к сожалению базы не хватает Не подскажешь где это можно прочесть на русском языке? |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Что-то в этом духе:
#include <stdio.h> (тестовый пример проходит, погоняй еще, может я где-то ошибся при переносе на С...) |
Nucris |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Огромнео спасибо, протестирую, но спасибо за это решение огромное...
Если я ещё не совсем достал, то очень хотелось бы разобраться хотя бы в этом конкретнои примере , т.е. комментарии к решению услышать...если возможно конечно Если омжно узнать, а заголовочник что должен в себе содержать, просто я взял один сурс файл и скинул туда исходник при запуске получил свдения об отсутствии header. Что в него вписать? |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Ну, это во-первых, зависит от твоего компилятора. Ты ж молчишь, я тебе привел решение, работающее на Turbo C++ 3.0 (1990 года выпуска). Тут мне ничего больше не понадобилось, только этот CPP... В других компиляторах может быть по-другому.
|
Nucris |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
понятно, да на будущее учту, что точность формулировки крайне важна... Мне бы на C, а компилятор Visual C 2005
|
Michael_Rybak |
![]()
Сообщение
#10
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Цитата Не подскажешь где это можно прочесть на русском языке? Погугли "поиск максимального цикла" или "гамильтонов цикл". Вообще, вынужден я тут признать, что это я глупость написал: Цитата Дело в том, что, если бы эту задачу можно было решать эффективно, то таким же алгоритмом можно было бы искать гамильтонов цикл - если он есть, то наше решение его выдаст, если нету - выдаст меньший цикл. Глупость потому, что гамильтонов цикл обязан проходить по каждой вершине ровно 1 раз, а цикл по доминошкам - нет. Вообще забей на это, как я понимаю, переборное решение тебя в любом случае устраивает, так что просто разбирайся с кодом volvo |
Nucris |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Понятно, но все равно тебе спасибо
Очень прошу volvo перевести это решение на чистый С, чтобы оно работало под компилятор Visual C 2005 ... просто у нас завтро проверка что делать никто не знате, пытаться что то доказывать преподу дело гиблое... |
Michael_Rybak |
![]()
Сообщение
#12
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Ты может BuildLog запости, не у всех ведь есть VC.
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата Очень прошу volvo перевести это решение на чистый С А где, собственно, ты увидел отклонения от чистого С? Программа полностью соответствует Стандарту, компилируется и работает в GCC, а если VC НЕ компилирует такие программы - то это его проблемы.У меня VC, кстати, именно по этой причине и нету. Ну, хорошо. Вот это попробуй (убрал я тип bool, на который давалось предупреждение... Теперь нет предупреждений вообще...): #include <stdio.h> |
Nucris |
![]()
Сообщение
#14
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Запустил, а этот visual собака ругается и вот это выкидыват
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\srav\srav\main.c(2) : fatal error C1083: Cannot open include file: 'mem.h': No such file or directory Ещё, понимаю что ужасно достал уже всех с этой задачей, но если бы небльшие поясннеия к исходнику (мы вообще то здаём не на компах а как бы так на проверку, потому от чатси галвное продемонстрировать понимание решения), вот собственно хотелось бы его понять Сообщение отредактировано: Nucris - 9.10.2006 14:40 |
Michael_Rybak |
![]()
Сообщение
#15
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\srav\srav\main.c(2) : fatal error C1083: Cannot open include file: 'mem.h': No such file or directory А может, попробуй создать пустой mem.h да и всё ![]() А не получится - посмотри хоть какую нибудь прогу, которая компилится на этом жутком вижуале ![]() Кроме того, если вы сдаете не на компах - в чем проблема, скачай себе эти 17 метров MINGW и всё круто будет. Или, могу тебе старый добрый ТС 3.0 выслать, он 3 метра весит. Кстати, volvo, мой ТС 3.0 не понимает "int m[max_num + 1][max_num + 1] = {};" Ещё, понимаю что ужасно достал уже всех с этой задачей, но если бы небльшие поясннеия к исходнику (мы вообще то здаём не на компах а как бы так на проверку, потому от чатси галвное продемонстрировать понимание решения), вот собственно хотелось бы его понять Как раз наоборот - намного приятнее, когда хочешь разобраться, чем когда хочешь просто сдать. |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата Кстати, volvo, мой ТС 3.0 не понимает "int m[max_num + 1][max_num + 1] = {};" Ребят, вам шашечки, или ехать? Первая программа работала на TC - не понравилось, теперь работает в ICC/GCC - опять нехорошо... |
Nucris |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вышли пожалуйста на lit12@bk.ru
|
Michael_Rybak |
![]()
Сообщение
#18
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Ура!
Короче я вот спросил на форуме TopCoder'a, и там ulzha родил гениальную мысль. Вот полученная им цепочка рассуждений: 1. Представим все возможные числа на доминошках - вершинами в графе, а сами доминошки - ребрами. Теперь перед нами стоит задача построения самого длинного замкнутого маршрута, проходящего через каждое ребро не больше 1 раза, а через каждую вершину - произвольное кол-во раз. 2. Пусть в графе n вершин и m ребер. Добавим к каждой вершине цикл длины m+1, т.е. m новых, фиктивных вершин. Получится, что, если в начальном графе существовал замкнутый маршрут, проходящий через каждую вершину как минимум один раз, то в новом графе, дополненном циклами, обязательно существует маршрут длины большей, чем n*(m+1) - ведь из каждой вершины мы можем пройтись по ее дополнительному циклу. Понятно, что верно и обратное утверждение: получить в новом графе маршрут длины большей, чем n*(m+1), можно *только* посетив каждую вершину оригинального графа как минимум один раз. 3. M. R. Garey, D. S. Johnson и R. Endre Tarjan показали, что поиск гамильтонова цикла в планарном, кубическом, 3-связном графе является NP-полной задачей. 4. Кубический граф - такой, у которого степень каждой вершины равна 3. Получается, замкнутый маршрут в таком графе не может побывать в какой-нибудь вершине больше одного раза - ведь это означало бы, что ее степень - как минимум 4. 5. Сведем это воедино.
Браво, ulzha! |
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 2:27 |