Задача китайского почтальона. Поиск Эйлерового цикла
В вузе задали решить задачу Китайского почтальона.Вот алгоритм её решения.
Смотрим Эйлеровый ли граф нам попался. Если да переходим к пункту (5).
Строим матрицу расстояний для графов с нечётными степенями вершин.
Строим минимальные паросочетания.
У найденных пар строим мнимые пути.Теперь наш граф Эйлеровый.
Находим Эйлеровый цикл это и будет ответ в нашей задачи. Проблема с 5 пунктом, если граф изначально был не Эйлеровый. Выводит не понятный для меня путь. Пытался сам найти ошибку ничего не вышло. Матрицу смежности задаю в виде
0 1 1 0
1 0 1 1
1 1 0 2
0 2 1 0
Где цифры больше 0 означают количество путей, в том числе и мнимых.При такой матрице выводятся значения 01133210private List<Integer> eilerPath(int[][] matrixAdjacency) { Stack<Integer> stack = new Stack<>(); List<Integer> list = new ArrayList<>(); int v = 0; int u; int edge; stack.push(v); while (!stack.empty()) { edge = findAdjacencyVertex(matrixAdjacency, stack.peek()); if (edge == -1) { list.add(stack.pop()); } else { u = edge; matrixAdjacency[stack.peek()][u]--; matrixAdjacency[u][stack.peek()]--; stack.push(u); } } return list; } private int findAdjacencyVertex(int[][] matrixAdjacency, int edge) { for (int i = 0; i < matrixAdjacency.length; i++) { if (matrixAdjacency[edge][i] > 0) { return i; } } return -1; }
Ответы (1 шт):
Алгоритм полностью работает. Нашёл у себя ошибку в другом месте кода. Не совсем правильно строилась матрица смежности с мнимыми путями. В некоторых местах просто их не добавляла из-за чего возникали пути с нечётным количеством рёбер.