Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2014, 22:27   #1
kappa937
Пользователь
 
Регистрация: 15.12.2013
Сообщений: 42
По умолчанию Как научиться решать задачи на графы?

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



Думаю, понятно, о чем я.

С помощью матрицы смежности я нашел вершины 6, 9 и 5. (Пробегаюсь по строкам матрицы и считаю кол-во единиц, получается кол-во ребер для i-той вершины) То есть те, от которых надо пробежаться до основания "хвоста" (вершина 4).
Но как, собственно, "пробежаться", используя эту матрицу?

И, в общем, какие задачи чаще всего даются по графам и самое главное: как их научиться решать, представляя в памяти как двумерные массивы (или, может быть, есть более удобные способы) ?

Заранее спасибо.

Последний раз редактировалось kappa937; 18.11.2014 в 22:28. Причина: дополнение
kappa937 вне форума Ответить с цитированием
Старый 18.11.2014, 22:45   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Для тренировки можно, например, порешать тут - http://informatics.mccme.ru/course/view.php?id=6.

По задаче. Предполагаю. Нашли по матрице смежности все строки с одной единичкой. Для каждой найденной вершины Z: переходим в строку для вершины D, помеченной единичкой, и проверяем, есть ли там две единички. Если да (вершина D лежит в хвосте), то увеличиваем счетчик и переходим к следующей вершине K, если нету (или конец хвоста, или вершина D с несколькими хвостами), то увеличиваем счетчик и заканчиваем поиск для вершины Z.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.11.2014, 00:09   #3
kappa937
Пользователь
 
Регистрация: 15.12.2013
Сообщений: 42
По умолчанию

BDA, спасибо!
kappa937 вне форума Ответить с цитированием
Старый 19.11.2014, 02:14   #4
kappa937
Пользователь
 
Регистрация: 15.12.2013
Сообщений: 42
По умолчанию

В общем, возникла проблема.
BDA, видимо, я неверно вас понял.
Делаю так:
Нахожу основание для хвоста (на этом примере это вершина 4), в цикле прохожусь от одной из вершин (6, 9 и 5) до 4, проверяю все строки и смотрю, есть ли там 2 единицы.
То есть для 6 проверяется две строки, для 5 - одна, а для 9 - 5.
Этот способ срабатывает и находит на этом примере 3. Но что если сделать, например, так:

Тогда от вершины 10 до основания хвоста 4 пройдут целые 6 строк, и количество тех, в которых по 2 единицы - не совпадут с длиной этого хвоста.
Как быть?
kappa937 вне форума Ответить с цитированием
Старый 19.11.2014, 02:36   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Да, пожалуй, неверно.
Матрица смежности для последней картинки:
Код HTML:
  1 2 3 4 5 6 7 8 9 10
 1  * * *
 2*   * *
 3* *   *
 4* * *   * * *
 5      *           *
 6      *
 7      *       *
 8            *   *
 9              *
10        *
6 9 10 вершины - концы хвостов (один переход в таблице).
Для вершины 10:
В матрице указан переход к 5 вершине - +1 к счетчику, переход к 5
Для 5 вершины в матрице 2 перехода (к 4 и к 10) - +1 к счетчику, переход к 4
Для 4 вершины в матрице 6 переходов = узел - возврат из рекурсии (цикла)
результат для 10 вершины = 2

Аналогично для 6 и 9.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.11.2014, 04:43   #6
kappa937
Пользователь
 
Регистрация: 15.12.2013
Сообщений: 42
По умолчанию

Наконец всё получилось, огромное спасибо! )
kappa937 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ребят я не могу понять как решать эти задачи!может кто помочь в решении представленной задачи? Andrusha07 Помощь студентам 0 09.03.2012 23:08
Как решать задачи с массивами? jupy Помощь студентам 2 09.06.2011 20:16
Объясните как решать задачи sektor2011 Помощь студентам 3 24.01.2011 11:45