Алгоритм Флери для нахождения цикла Эйлера в графе - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Может кто-нибудь делал такую работу, я просто не представляю как ее делать. Помогите пожалуйста.

Решение задачи: «Алгоритм Флери для нахождения цикла Эйлера в графе»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define N 6
  5. #define STACK_SIZE 100
  6.  
  7.  
  8. int G[N][N] =
  9. {
  10.     {0, 1, 1, 1, 1, 0},
  11.     {1, 0, 0, 1, 0, 0},
  12.     {1, 0, 0, 1, 1, 1},
  13.     {1, 1, 1, 0, 0, 1},
  14.     {1, 0, 1, 0, 0, 0},
  15.     {0, 0, 1, 1, 0, 0}
  16. };
  17.  
  18. int k;
  19. int Stack[STACK_SIZE];
  20.  
  21. void Search(int v)
  22. {
  23.     int i;
  24.     for(i = 0; i < N; i++)
  25.         if(G[v][i])
  26.         {
  27.             G[v][i] = G[i][v] = 0;
  28.             Search(i);
  29.         }
  30.     Stack[++k] = v;
  31. }
  32.  
  33.  
  34.  
  35. int main()
  36. {
  37.     int T, p, q, s;
  38.     int j, vv;
  39.  
  40.     T = 1;
  41.     for(p = 0; p < N; p++)
  42.     {
  43.         s = 0;
  44.         for(q = 0; q < N; q++)
  45.         {
  46.             s += G[p][q];
  47.         }
  48.         if(s%2) T = 0;
  49.     }
  50.     k = -1;
  51.     printf("start vertex: "); scanf("%d", &vv);
  52.     if(T)
  53.     {
  54.         Search (vv);
  55.         for(j = 0; j <= k; j++)
  56.             printf("%d ", Stack[j]);
  57.     }
  58.     else
  59.         printf("not Eulerian graph\n");
  60.     return 0;
  61. }

Объяснение кода листинга программы

В данном коде реализован алгоритм Флери для поиска цикла Эйлера в графе. Список действий:

  1. Подготовительные действия:
    • Включаем необходимые заголовочные файлы: и .
    • Определяем значения переменных N и STACK_SIZE. Значение N - количество вершин в графе, а STACK_SIZE - размер стека.
    • Задаем матрицу смежности графа в виде двумерного массива G[N][N]. Если ребро между вершинами v и i существует, то G[v][i] равно 1, иначе 0.
    • Инициализируем переменную k значением -1, которая будет использоваться как счетчик для стека.
    • Объявляем функцию Search, которая будет выполнять поиск цикла Эйлера.
    • В функции main задаем значения переменных T, p, q, s, а также инициализируем переменную vv значением 0 (начальная вершина).
    • Задаем значения переменных T, p и q, используя цикл for. Значение T будет равно 1, если в графе есть цикл Эйлера, и 0 в противном случае. Значения p и q используются для прохода по матрице G.
    • С помощью цикла for инициируем переменную s значением суммы элементов матрицы G[p][]. Если сумма нечетная, то T присваивается 0.
    • После завершения цикла, инициализируем переменную k значением -1 и выводим сообщение с просьбой ввести начальную вершину.
    • Если T равно 1, то вызываем функцию Search с аргументом vv.
    • В цикле for, начинающемся с k = -1 и выполняющемся до k <= k, выводим значения стека.
    • Если T равно 0, то выводим сообщение not Eulerian graph.
    • Завершаем функцию main. Алгоритм Флери работает следующим образом:
  2. Начинаем с любой вершины графа и помещаем ее в стек.
  3. В цикле, пока стек не пуст, извлекаем из него вершину и помечаем все ее соседи, как посещенные.
  4. Если вершина является конечной, то ищем цикл Эйлера.
  5. Если цикл найден, то выводим его, в противном случае выводим сообщение о том, что граф не является эйлеровым. Пример работы алгоритма:
  6. Запускаем программу.
  7. Вводим начальную вершину (например, 0).
  8. Программа начинает работу.
  9. Переменная T становится равной 1, так как в графе есть цикл Эйлера.
  10. Программа вызывает функцию Search с аргументом 0.
  11. В функции Search, в цикле for, начиная с 0 и до 5 (так как N = 6), для каждой вершины, если ребро существует, то помечаем вершину и ее соседей, как посещенные, и помещаем их в стек.
  12. После завершения цикла, в стеке остаются вершины {0, 2, 4, 6}.
  13. Переменная k становится равной 4, так как в стеке осталось 4 вершины.
  14. В цикле for, начиная с k = 4 и до k <= 4, выводятся значения стека {0, 2, 4, 6}.
  15. Программа завершается, выводя сообщение Eulerian graph.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы