/
AirLexa
/
03
Обзор
Документация
Войти
/
AirLexa
/
03
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_07/Task_3/Task_3.cpp
78 строк
3 KB
AirLexa
загрузил Lesson_07/Task_3/Task_3.cpp
23 янв 2026, 14:49
Верифицирован
23 янв 2026, 14:49
eff039c
Код
Авторство
О чём код?
#include <iostream> #include <fstream> #include <windows.h> void visit(int n, int p, bool** arr, bool* check, int size, bool &cycle) { if (cycle) return; // если был найден цикл, смысла нет продолжать дальше check[n] = true; // посетили вершину std::cout << " " << (n + 1); // выводим ее на экран for (int i = 0; i < size; i++) // пробегаем по ее ребрам if (arr[n][i] && !check[i]) visit(i, n, arr, check, size, cycle); else // если есть ребро и мы его посещали и оно не предыдущее if (arr[n][i] && check[i] && i != p) { if (!cycle) std::cout << " цикл"; cycle = true; } } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); std::string name = ""; std::cout << "Введите номер матрицы (1/2): "; std::cin >> name; name = "input_" + name + ".txt"; std::ifstream file(name); // файл инициализации в папке с исполняемым файлом if (!file.is_open()) // проверка на доступ к файлу { std::cout << "Ошибка открытия файла: " << name << std::endl; return -1; } int size = 0; file >> size; // первая строчка - это размер массива if (size <= 1) // проверка на корректность значений размера { std::cout << "Ошибка! Количество вершин графа должно быть 2 или больше!" << std::endl; return -2; } // двухмерный массив bool** arr = new bool* [size]; // пользуемся тем, что 0 = false, !0 = true for (int i = 0; i < size; i++) { arr[i] = new bool[size](); for (int j = 0; j < size; j++) // заполняем массив данными file >> arr[i][j]; } file.close(); // файл больше не понадобится std::cout << "Исходная матрица смежности:\n"; for (int i = 0; i < size; i++) // выводим массив на консоль { for (int j = 0; j < size; j++) std::cout << arr[i][j] << " "; std::cout << std::endl; } std::cout << "Порядок обхода вершин:"; bool* check = new bool[size](); // массив хранения посещенных вершин bool cycle = false; // метка наличия цикла for (int i = 0; i < size; i++) // обходим все непосещенные вершины if (!check[i]) visit(i, -1, arr, check, size, cycle); std::cout << std::endl; if (cycle) std::cout << "В графе есть цикл!"; else std::cout << "В графе нет циклов!"; std::cout << std::endl; for (int i = 0; i < size; i++) // освобождаем память delete[] arr[i]; delete[] arr; delete[] check; return 0; }