Создание эйлерового цикла
Поставленная задача
Разработать консольное приложение, осуществляющее построение цикла Эйлера в задаваемом графе (алгоритм Эйлера решения задачи о Кенигсбергских мостах). Граф должен задаваться матрицей смежности с клавиатуры или из файла. Вывод: перечень вершин цикла Эйлера или сообщение, что построение цикла Эйлера невозможно.
Код программы:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
vector <vector< int >> massiv;
string h;
int v1 = -1, v2 = -1;
int first = 0, e = 0, c = 0;
nazad:
double size;
int m;
int sim;
bool pc;
bool ps = false;
bool pse = false;
bool el = true;
bool bad = false;
while (!ps)
{
cout << "Введите количество вершин графа:" << endl;
cin >> size;
if (size == (long long)size) {
if (cin.good() && size > 0)
{
cout << "Размер матрицы введён правильно, продолжаем!" << endl;
massiv.assign(size, vector<int>(size));
ps = true;
}
else
{
cout << "Размер матрицы введён неправильно, необходимо целое неотрицательное число!" << endl;
cin.clear();
cin.ignore();
}
}
}
while (!pse)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
pc = false;
while (!pc)
{
cin >> massiv[i][j];
if (cin.good())
{
if (massiv[i][j] == 1 || massiv[i][j] == 0)
{
if (i == j && massiv[i][j] != 0)
{
cout << "На главной диагонали необходимы 0!" << endl;
cin.clear();
cin.ignore();
}
else
{
pc = true;
}
}
else
{
cout << "Введите 0 или 1!" << endl;
cin.clear();
cin.ignore();
}
}
else
{
cout << "Был введен символ, а необходимо 0 или 1!" << endl;
cin.clear();
cin.ignore();
}
}
}
}
sim = 0;
cout << "Проверка на симметричность:" << endl;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (massiv[i][j] != massiv[j][i])
{
sim++;
}
}
}
if (sim > 0)
{
cout << "Матрица не симметрична, введите заново" << endl;
}
else
{
cout << "Матрица симметрична, продолжаем" << endl;
pse = true;
}
}
cout << "Ваша матрица выглядит так:" << endl;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << massiv[i][j] << " ";
}
cout << endl;
}
do
{
cout << endl;
cout << "1. Эйлеров цикл \n";
cout << "2. Задание нового массива\n";
cout << "3. Выход из программы\n";
cout << endl;
cin >> m;
cout << endl;
// Меню программы
switch (m)
{
// Цикл Эйлера
case 1:
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (massiv[i][j] == 1)
{
c++;
e++;
}
}
if (e % 2 == 1)
{
cout << "Этот граф не является Эйлеровым" << endl;
el = false;
break;
}
e = 0;
}
c /= 2;
cout << "Путь графа Эйлера:" << endl;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (massiv[i][j] == 1) {
cout << i + 1 << endl;
h = "y";
break;
}
}
if (h == "y") {
break;
}
}
while (c > 0) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (massiv[i][j] == 1) {
massiv[i][j] = 0;
massiv[j][i] = 0;
cout << j + 1 << endl;
i = j;
j = -1;
c--;
}
}
}
}
break;
}
//
// Задание нового массива
case 2:
{
cout << endl;
goto nazad;
}
break;
}
//
} while (m != 3);
}
Алгоритм работает только если вводишь 3 вершины графа, если вводить больше, там 4 или 5, то он не пересекает одно ребро, помогите пожалуйста)
Если вводишь 3 вершины графа 0 1 1 1 0 1 1 1 0
То путь эйлера верный: 1 - 2 - 3 - 1
Но если вводишь 4 вершины графа 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 То путь эйлера становится неверный 1 - 2 - 3 - 1 - 4 - 2 - 4
Он не проходит через ребро 3 - 4