Создание эйлерового цикла

Поставленная задача

Разработать консольное приложение, осуществляющее построение цикла Эйлера в задаваемом графе (алгоритм Эйлера решения задачи о Кенигсбергских мостах). Граф должен задаваться матрицей смежности с клавиатуры или из файла. Вывод: перечень вершин цикла Эйлера или сообщение, что построение цикла Эйлера невозможно.

Код программы:

#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


Ответы (0 шт):