Advertisement
Val_Kir

ебучая теория

Jul 2nd, 2020
1,284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.44 KB | None | 0 0
  1. /*Обход графа: поиск в глубину
  2. Поиск в глубину позволяет обойти все вершины графа по одному разу, переходя от вершины к вершине по ребрам.
  3. Поиск в глубину реализуется рекурсивным алгоритмом:
  4. Пусть выбрана некоторая не рассмотренная ранее вершина A
  5. Перебираем все исходящие из A ребра, при этом:
  6. если ребро ведет в не рассмотренную ранее вершину B, то продолжаем поиск рекурсивно от B
  7. после обработки B возвращаемся в A и продолжаем перебирать исходящие из A ребра
  8. если все ребра из A проверены, то либо возвращаемся к вершине, из которой мы пришли в A (если такая есть), либо выбираем любую ранее не проверенную вершину и выполняем алгоритм от нее.
  9. Граф 𝐺={𝑉,𝐸} связный, если для любой пары вершин 𝑣,𝑤 𝜖 𝑉 существует соединяющий их маршрут, проходящий по ребрам.
  10. Поиск в глубину разбивает множество ребер 𝐸 на 2 подмножества: древесные (от текущей вершины к непроверенной) и обратные (к уже проверенной вершине). Древесные ребра образуют дерево (связный граф без циклов), для которого определен порядок обхода вершин при поиске в глубину.
  11. Компоненты связности неориентированного графа это максимальные (по включению вершин) связные подграфы.
  12. Для выделения компонент связности используем поиск в глубину, внеся следующие изменения:
  13. добавим в класс MGraph целую переменную comptotal, в которой будет вычисляться число компонент
  14. изменим процесс формирования массива R: R[i] будет хранить номер компоненты (от 1), включающую вершину i (R[i]=0, если вершина i еще не просмотрена).
  15. Приводимые далее методы cdeep и  get_comp – это модификации методов deep и DFS.
  16.  
  17.  
  18.  Обход графа: поиск в ширину
  19. Поиск в ширину обычно используется для проверки, существует ли маршрут из некоторой вершины-источника v в целевую вершину w, проходящий по ребрам графа.
  20. В процессе поиска вершины помещаются в очередь для просмотра. Начальная очередь содержит только v.
  21. Пусть u – текущая извлекаемая из очереди вершина.
  22. Рассмотрим все ребра (u,x), при этом возможны варианты:
  23. x просмотрена или находится в очереди – изменений нет,
  24. x=w – маршрут найден, алгоритм завершается
  25. x добавляется в очередь.
  26. Если w не найдена, то после обработки всех ребер (u,x) из очереди выбирается следующая текущая вершина u, и поиск продолжается.
  27. Если очередь закончилась, то маршрута из v в w нет.
  28. При поиске в ширину можно не только определить, существует ли маршрут из v в w, но и вычислить его минимальную длину (минимальное число пройденных ребер). Для этого нужно вычислять уровни просмотренных вершин (массив Lev[0…n-1]):
  29. вершина-источник v имеет уровень 1, начальные значения для остальных вершин Lev[i]=0 (это означает, что вершина i еще не рассмотрена),
  30. если Lev[u]=a, существует ребро (u,x) и Lev[x]=0, то для x устанавливается значение уровня Lev[x]=a+1,
  31. если Lev[w]>0, то существует, по крайней мере, один маршрут, и кратчайший маршрут содержит Lev[w]-1 ребро.
  32. Функция для поиска в ширину имеет 1 параметр – номер v (от 0) вершины-источника. Поиск закончится, когда будут просмотрены все вершины, достижимые из v.
  33. Для всех вершин графа будем формировать и возвращать массив уровней вершин Lev.
  34. Если в результате поиска Lev[w]=0 для некоторой вершины w, то w не достижима из v.
  35. Для организации очереди используем класс IQueue (очередь целых чисел) из раздела «Структуры и классы».
  36.  
  37.  
  38. Задача раскраски графов
  39. Задан неориентированный граф   с   вершинами.
  40. Раскрасить вершины   в   цветов – это значит найти такое отображение  , что   ребра   выполняется   (т.е. смежные вершины имеют разные цвета).
  41. Граф называется  -раскрашиваемым, если для него существует хотя бы одна раскраска в   цветов.
  42. Характеристикой любого графа   является его хроматическое число   – минимальное число цветов, необходимое для раскраски  . Обычно требуется найти именно минимальную раскраску вершин в   цветов.
  43.  
  44. Поиск минимальной раскраски по методу ветвей и границ:
  45. 1. Каким-то образом определяется начальная раскраска с числом цветов   (например,  , вершина   красится в цвет  ). Далее эта раскраска считается текущей минимальной.
  46. 2. Вершина 1 красится в цвет 1 (начало формирования текущей раскраски).
  47. 3. Пусть в текущей раскраске первые   вершин уже покрашены в   цветов. Для вершины   проверяется возможность ее покраски в цвета  , и для каждого допустимого варианта раскраска продолжается рекурсивно.
  48. 4. Если в текущей раскраске покрашено   вершин и использовано   цветов, то поиск продолжается, только если нужны все решения.
  49. 5. Текущая раскраска   вершин, содержащая   цветов, становится текущей минимальной.
  50.  
  51. В приведенном ниже алгоритме используются переменные (для связи с предыдущим описанием используем нумерацию вершин и цветов от 1):
  52. Pmin[1…n] – текущая минимальная раскраска,
  53. zmin – число различных цветов в Pmin,
  54. Pcur[1…n] – текущая раскраска,
  55. zmax – максимальное число цветов, используемых на текущем шаге,
  56. zcur – число различных цветов в Pcur на текущем шаге,
  57. С – матрица смежности.
  58. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement