![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 21.05.2014
Сообщений: 121
|
![]()
Доброго времени суток!
Хочу обратиться за помощью. Решаю сейчас задачу, и тестирование не проходит по времени. Идея, как я считаю, отличная, но почему-то не проходит по времени, не могу понять из-за чего проблема. Условие, идею и мой код смотрите ниже. Условие задачи: История Принцессы ограничение по времени на тест: 2.0 с ограничение по памяти на тест: 256 МБ Я нашёл Принцессу в подвале таверны, как и ожидал. После того, как она сделала ставки на турнир, мы поднялись наверх пропустить по стаканчику виски. Я надеялся выведать информацию о Драконе, ведь Принцесса в своё время частенько заходила к нему на Чай. Принцесса была непростой женщиной, и иметь с ней дело было крайне опасно. Как-то она по очереди встречалась с принцами, стараясь ради забавы перессорить их всех. Если Принцесса уходила от одного принца и начинала сразу же встречаться с его другом, то после этого они переставали быть друзьями. Со стороны было заметно, что она делает это специально: она перессорила всех друзей за минимальное количество переходов. Под звуки голоса Принцессы я чувствовал, как тьма из углов таверны расползается и покрывает всё вокруг. Чувство реальности покидало меня. Не надо быть Добрым Волшебником, чтобы догадаться, что она подсыпала что-то мне в стакан. Пламя жизни внутри меня угасало, я провалился во тьму. Как ловко она перессорила тех принцев. Как же она это сделала? Никогда не пейте виски с Принцессой. Входные данные В первой строке записаны два целых числа через пробел: n и m (2 ≤ n ≤ 10^5, 1 ≤ m ≤ 2·10^5) — количество принцев и количество пар друзей среди них соответственно. Далее в m строках через пробел записаны пары целых чисел ai и bi (1 ≤ ai < bi ≤ n) — пары номеров принцев, являющихся друзьями. Принцы нумеруются с единицы. Каждая пара представлена не более одного раза. Выходные данные В первой строке выведите единственное целое число k — минимальное количество принцев, с которыми должна последовательно встречаться Принцесса, чтобы перессорить всех друзей. Во второй строке выведите k целых чисел через пробел — номера принцев в том порядке, в котором Принцесса должна с ними встречаться. Если ответов несколько, выведите любой из них. Примеры: входные данные 9 5 2 4 2 6 3 5 3 9 5 9 выходные данные 7 3 9 5 3 6 2 4 входные данные 4 5 1 2 1 3 1 4 2 4 3 4 выходные данные 6 4 3 1 4 2 1 Идея решения: Здесь может быть несколько компонент связанностей, будем обрабатывать каждую по отдельности. Предварительно при чтении посчитаем степень каждой вершины (то есть количество рёбер, которые есть у этой вершины (рёбра неориентированные)). Затем при обработке очередной компоненты мы будем искать в ней эйлеров путь. Если вершин с нечётной степенью будет больше 2, то между любыми 2 вершинами с нечётной степенью создадим ребро. Будем так делать, пока у нас не останется 2 вершины с нечётной степенью (ведь вершин с нечётной степенью будет всегда чётное количество, да?). Затем запустим поиск эйлерова пути из вершины с нечётной степенью (если такие есть, если нет, то с любой) и после того как путь будет найден и записан в стэк, будем искать следующую компоненту. Ну, собственно вроде и всё, ниже код с комментариями. Код:
Работать должно вроде бы быстро, не могу понять из-за чего всё же оно не пашет(( Всем заранее спасибо за любую помощь! Последний раз редактировалось VladKB1; 18.08.2017 в 18:42. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 21.05.2014
Сообщений: 121
|
![]()
Всё задачу решил. Место хранения графа в векторе перевёл всё в set, могут быть случаи когда рёбер очень много а вершин не сильно и я постоянно буду от каждой вершины смотреть все рёбра и это долго, а так буду просто брать первое за log.
Код:
|
![]() |
![]() |
![]() |
#3 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
![]()
Ещё добрый совет, может быть, неожиданный: когда счёт идёт на миллисекунды, операция "cin >>" в цикле может съесть существенную часть времени. Лучше использовать scanf в стиле С.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
помогите разобраться с задачей, почему она не работает в Turbo С++? | Маська07 | Общие вопросы C/C++ | 11 | 15.01.2017 03:03 |
Помогите разобраться: Переустановил Windows 7, все работает,но почему то вместо установленных 6 ГБ ОЗУ доступно 1.99 Гб | TravisBarker | Помощь студентам | 7 | 10.12.2016 16:12 |
Почему при указании пути через имя компа сканирование не проходит, а через IP - проходит? | Oxidous | Операционные системы общие вопросы | 2 | 16.03.2016 11:00 |
Не могу разобраться почему не работает justify | F1ernandes | HTML и CSS | 2 | 28.01.2010 19:29 |
text-aling:justify , Не могу разобраться почему не работает | F1ernandes | HTML и CSS | 0 | 28.01.2010 11:55 |