/
AirLexa
/
03
Обзор
Документация
Войти
/
AirLexa
/
03
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_08/Task_2/Task_2.cpp
79 строк
3 KB
AirLexa
загрузил Lesson_08/Task_2/Task_2.cpp
27 янв 2026, 14:20
Верифицирован
27 янв 2026, 14:20
403ddf2
Код
Авторство
О чём код?
#include <iostream> #include <fstream> #include <stack> #include <windows.h> void visit(int n, bool** arr, bool* check, std::stack<int> &ord, int size) { check[n] = true; // посетили вершину for (int i = 0; i < size; i++) // пробегаем по ее ребрам if (arr[n][i] && !check[i]) visit(i, arr, check, ord, size); ord.push(n + 1); // в момент выхода из функции добавляем номер вершины. // Ибо все вершины, достижимые из n уже посещены обходом. // Следовательно, добавляя эту вершину в начало стэка, получаем // топологическую сортировку. } 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; } bool* check = new bool[size](); // массив хранения посещенных вершин std::stack<int> ord; // стэк хранения посещенных вершин for (int i = 0; i < size; i++) // обходим все непосещенные вершины if (!check[i]) visit(i, arr, check, ord, size); std::cout << "Топологический порядок вершин:"; while (!ord.empty()) { std::cout << " " << ord.top(); // выводим стэк на экран ord.pop(); } std::cout << std::endl; for (int i = 0; i < size; i++) // освобождаем память delete[] arr[i]; delete[] arr; delete[] check; return 0; }