Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h" // Стандартная библиотека Visual Studio, удали, если компилятор будет ругаться
- #include <iostream>
- #include <fstream> // Потоковое чтение файлов
- #include <Windows.h> // Для цветного вывода на консоли
- using namespace std;
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Позволяет использовать цвета
- constexpr auto STR = 12; // Количество строк в списке ребер
- constexpr auto COL = 2; // Количество столбцов в списке ребер
- constexpr auto SZ = 10; // Количество вершин / Размер матрицы смежности
- void SetColor(int num) { // Функция для простого изменения цвета
- SetConsoleTextAttribute(hConsole, num); // Передаем код цвета (цифру) в эту комманду
- }
- void PrintList(int **matrix) { // Вывод списка ребер на экран
- for (int i = 0; i < STR; i++) {
- for (int j = 0; j < COL; j++)
- cout << matrix[i][j] << " ";
- cout << endl;
- }
- }
- void PrintAdjMatrix(int **matrix, int Vx) { // Вывод матрицы смежности на экран
- cout << " "; // Это разметка для обозначений номеров клеток в таблице сверху (столбцы)
- for (int i = 0; i < SZ; i++) { // Само обозначение номеров в таблице
- if (i == Vx) { // Если i = вершине, которую мы ввели (по заданию)
- SetColor(10); // То она будет выведена ярко-зеленым цветом
- cout << "\t" << i + 1 << " "; // i + 1 потому, что в матрице столбцы/строки начинаются с 0, а вершины в матрице с 1
- }
- else { // Если i != вершине, которую мы ввели
- SetColor(2); // То она будет выведена просто зеленым цветом
- cout << "\t" << i + 1 << " ";
- }
- }
- cout << endl;
- for (int i = 0; i < SZ; i++) {
- if (i == Vx) { // То же самое, что и выше, но это нумерация клеток слева (строк). Та же идея с изменением цвета
- SetColor(10);
- cout << i + 1 << " \t";
- }
- else {
- SetColor(2);
- cout << i + 1 << " \t";
- }
- for (int j = 0; j < SZ; j++) {
- if (i == Vx && matrix[i][j] == 1 || j == Vx && matrix[i][j] == 1) { // Если i или j = введенной вершине и элемент равен единице, значит там есть ребро (вершины смежны)
- SetColor(10); // Значит выводим их ярко-зеленым цветом
- cout << matrix[i][j] << " \t";
- }
- else { // А если вершины не смежны
- SetColor(15); // То просто белым
- cout << matrix[i][j] << " \t";
- }
- }
- cout << endl;
- }
- }
- void AdjMatrixFill(int **adj, int **rl) { // Заполнение матрицы смежности из списка ребер
- for (int i = 0; i < STR; i++) {
- adj[rl[i][0]-1][rl[i][1]-1] = 1; // Чтобы понять что здесь написано, лучше посмотри вложенные файлы с матрицей смежностью и списком ребер
- adj[rl[i][1] - 1][rl[i][0] - 1] = 1;
- }
- for (int i = 0; i < SZ; i++) {
- for (int j = 0; j < SZ; j++)
- if (adj[i][j] != 1) adj[i][j] = 0; // Если в прошлом цикле элементу не была присвоена 1, то он будет 0
- }
- }
- void PrintAdjRibs(int **matrix, int Vx) { // Вывод вершин, смежных введенной вершине (по заданию)
- for (int j = 0; j < SZ; j++) {
- if (matrix[Vx][j] == 1) {
- cout << "Вершина "; SetColor(10); cout << j + 1; SetColor(15); cout << " смежна с вершиной "; SetColor(10); cout << Vx + 1 << endl; SetColor(15);
- }
- }
- }
- int GraphDeg(int **matrix) { // Вычисление степени графа. Степень графа - это макс. количество ребер, входящее в одну вершину
- int max = 0, sum = 0; // max - максимальное число входящих вершин, sum - сумма входящих ребер в одну вершину
- for (int i = 0; i < SZ; i++) {
- for (int j = 0; j < SZ; j++)
- sum += matrix[i][j];
- if (sum > max) max = sum;
- sum = 0;
- }
- return max;
- }
- int RibsCount(int **matrix) { // Функция-счетчик ребер в графе
- int count = 0; // Сам счечтик
- for (int i = 0; i <= SZ / 2; i++) { // Идем лишь до половины размера, т.к. нет смысла проверять после 5 строки или столбца (просто будут повторяться и счечтик собъется)
- for (int j = 0; j <= SZ / 2; j++)
- if (matrix[i][j] == 1 && matrix[j][i] == 1) count++; // Если, например [1,2] = 1 и [2,1] = 1 - то это ребро, так для всех остальных случаев
- }
- return count;
- }
- int main() {
- setlocale(LC_ALL, "Russian"); // Вывод русского языка в консоли
- ifstream F("C:/Users/Артем/Desktop/Ribs.txt"); // Открываем поток для чтения из файла. В скобках введи свою директорию в таком же формате
- int i, j, Vx; // i, j - просто для циклов for, Vx - вершина, которую мы вводим с клавиатуры (для этого ребра надо выписать все смежные ему ребра)
- cout << "Vx = "; cin >> Vx;
- Vx--; // Уменьшаем его на 1, т.к. элементы в матрице начинаются с 0, а вершины с 1
- if (Vx > 9 || Vx < 0) { // Просто проверка, чтобы не было введено кривое значение
- cout << "Ошибка. Такого ребра нет.";
- return 0;
- }
- int **RibsList = new int*[STR]; // Динамическая матрица для списка ребер, здесь создаются строки
- int **AdjMatrix = new int*[SZ]; // Динамическая матрица смежности, тоже создаются строки
- for (i = 0; i < STR; i++)
- RibsList[i] = new int[COL]; // Выделение столбцов для списка ребер
- for (i = 0; i < SZ; i++)
- AdjMatrix[i] = new int[SZ]; // Выделение столбцов для матрицы смежности
- if (F.is_open()) { // Если файл открылся
- while (!F.eof()) { // То идем до конца файла
- for (i = 0; i < STR; i++) {
- for (j = 0; j < COL; j++)
- F >> RibsList[i][j]; // Считываем поочередно элементы из файла в матрицу
- }
- }
- }
- cout << "Список ребер считан из файла: " << endl << endl; // Выводим список ребер, считаный из файла
- PrintList(RibsList);
- AdjMatrixFill(AdjMatrix, RibsList); // Заполняем с помощью списка ребер матрицу смежности
- cout << endl << "Матрица смежности заполнена: " << endl << endl;
- PrintAdjMatrix(AdjMatrix, Vx); cout << endl;
- PrintAdjRibs(AdjMatrix, Vx); cout << endl;
- cout << "Степень графа: " << GraphDeg(AdjMatrix) << endl << endl;
- cout << "Количество ребер в графе: " << RibsCount(AdjMatrix) << endl << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement