Алгоритм Флери для нахождения цикла Эйлера в графе - C (СИ)
Формулировка задачи:
Может кто-нибудь делал такую работу, я просто не представляю как ее делать. Помогите пожалуйста.
Решение задачи: «Алгоритм Флери для нахождения цикла Эйлера в графе»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define N 6 #define STACK_SIZE 100 int G[N][N] = { {0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 1, 1}, {1, 1, 1, 0, 0, 1}, {1, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 0, 0} }; int k; int Stack[STACK_SIZE]; void Search(int v) { int i; for(i = 0; i < N; i++) if(G[v][i]) { G[v][i] = G[i][v] = 0; Search(i); } Stack[++k] = v; } int main() { int T, p, q, s; int j, vv; T = 1; for(p = 0; p < N; p++) { s = 0; for(q = 0; q < N; q++) { s += G[p][q]; } if(s%2) T = 0; } k = -1; printf("start vertex: "); scanf("%d", &vv); if(T) { Search (vv); for(j = 0; j <= k; j++) printf("%d ", Stack[j]); } else printf("not Eulerian graph\n"); return 0; }
Объяснение кода листинга программы
В данном коде реализован алгоритм Флери для поиска цикла Эйлера в графе. Список действий:
- Подготовительные действия:
- Включаем необходимые заголовочные файлы:
и . - Определяем значения переменных 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. Алгоритм Флери работает следующим образом:
- Включаем необходимые заголовочные файлы:
- Начинаем с любой вершины графа и помещаем ее в стек.
- В цикле, пока стек не пуст, извлекаем из него вершину и помечаем все ее соседи, как посещенные.
- Если вершина является конечной, то ищем цикл Эйлера.
- Если цикл найден, то выводим его, в противном случае выводим сообщение о том, что граф не является эйлеровым. Пример работы алгоритма:
- Запускаем программу.
- Вводим начальную вершину (например, 0).
- Программа начинает работу.
- Переменная T становится равной 1, так как в графе есть цикл Эйлера.
- Программа вызывает функцию Search с аргументом 0.
- В функции Search, в цикле for, начиная с 0 и до 5 (так как N = 6), для каждой вершины, если ребро существует, то помечаем вершину и ее соседей, как посещенные, и помещаем их в стек.
- После завершения цикла, в стеке остаются вершины {0, 2, 4, 6}.
- Переменная k становится равной 4, так как в стеке осталось 4 вершины.
- В цикле for, начиная с k = 4 и до k <= 4, выводятся значения стека {0, 2, 4, 6}.
- Программа завершается, выводя сообщение
Eulerian graph
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д