Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.82 KB | None | 0 0
  1. #include "pch.h"   // Стандартная библиотека Visual Studio, удали, если компилятор будет ругаться
  2. #include <iostream>
  3. #include <fstream>    // Потоковое чтение файлов
  4. #include <Windows.h>    // Для цветного вывода на консоли
  5.  
  6. using namespace std;
  7.  
  8. HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);    // Позволяет использовать цвета
  9.  
  10. constexpr auto STR = 12;    // Количество строк в списке ребер
  11. constexpr auto COL = 2;    // Количество столбцов в списке ребер
  12. constexpr auto SZ = 10;    // Количество вершин / Размер матрицы смежности
  13.  
  14. void SetColor(int num) {    // Функция для простого изменения цвета
  15.     SetConsoleTextAttribute(hConsole, num);    // Передаем код цвета (цифру) в эту комманду
  16. }
  17.  
  18. void PrintList(int **matrix) {    // Вывод списка ребер на экран
  19.     for (int i = 0; i < STR; i++) {
  20.         for (int j = 0; j < COL; j++)
  21.             cout << matrix[i][j] << " ";
  22.         cout << endl;
  23.     }
  24. }
  25.  
  26. void PrintAdjMatrix(int **matrix, int Vx) {    // Вывод матрицы смежности на экран
  27.     cout << "  ";    // Это разметка для обозначений номеров клеток в таблице сверху (столбцы)
  28.     for (int i = 0; i < SZ; i++) {    // Само обозначение номеров в таблице
  29.         if (i == Vx) {    // Если i = вершине, которую мы ввели (по заданию)
  30.             SetColor(10);    // То она будет выведена ярко-зеленым цветом
  31.             cout << "\t" << i + 1 << " ";    // i + 1 потому, что в матрице столбцы/строки начинаются с 0, а вершины в матрице с 1
  32.         }
  33.         else {    // Если i != вершине, которую мы ввели
  34.             SetColor(2);    // То она будет выведена просто зеленым цветом
  35.             cout << "\t" << i + 1 << " ";
  36.         }
  37.     }
  38.     cout << endl;
  39.     for (int i = 0; i < SZ; i++) {
  40.         if (i == Vx) {    // То же самое, что и выше, но это нумерация клеток слева (строк). Та же идея с изменением цвета
  41.             SetColor(10);
  42.             cout << i + 1 << " \t";
  43.         }
  44.         else {
  45.             SetColor(2);
  46.             cout << i + 1 << " \t";
  47.         }
  48.         for (int j = 0; j < SZ; j++) {
  49.             if (i == Vx && matrix[i][j] == 1 || j == Vx && matrix[i][j] == 1) {    // Если i или j = введенной вершине и элемент равен единице, значит там есть ребро (вершины смежны)
  50.                 SetColor(10);    // Значит выводим их ярко-зеленым цветом
  51.                 cout << matrix[i][j] << " \t";
  52.             }
  53.             else {    // А если вершины не смежны
  54.                 SetColor(15);    // То просто белым
  55.                 cout << matrix[i][j] << " \t";
  56.             }
  57.         }
  58.         cout << endl;
  59.     }
  60. }
  61.  
  62. void AdjMatrixFill(int **adj, int **rl) {    // Заполнение матрицы смежности из списка ребер
  63.     for (int i = 0; i < STR; i++) {    
  64.         adj[rl[i][0]-1][rl[i][1]-1] = 1;    // Чтобы понять что здесь написано, лучше посмотри вложенные файлы с матрицей смежностью и списком ребер
  65.         adj[rl[i][1] - 1][rl[i][0] - 1] = 1;  
  66.     }
  67.     for (int i = 0; i < SZ; i++) {
  68.         for (int j = 0; j < SZ; j++)
  69.             if (adj[i][j] != 1) adj[i][j] = 0;    // Если в прошлом цикле элементу не была присвоена 1, то он будет 0
  70.     }
  71. }
  72.  
  73. void PrintAdjRibs(int **matrix, int Vx) {   // Вывод вершин, смежных введенной вершине (по заданию)
  74.     for (int j = 0; j < SZ; j++) {
  75.         if (matrix[Vx][j] == 1) {
  76.             cout << "Вершина "; SetColor(10); cout << j + 1; SetColor(15); cout << " смежна с вершиной "; SetColor(10); cout << Vx + 1 << endl; SetColor(15);
  77.         }
  78.     }
  79. }
  80.  
  81. int GraphDeg(int **matrix) {     // Вычисление степени графа. Степень графа - это макс. количество ребер, входящее в одну вершину
  82.     int max = 0, sum = 0;    // max - максимальное число входящих вершин, sum - сумма входящих ребер в одну вершину
  83.     for (int i = 0; i < SZ; i++) {
  84.         for (int j = 0; j < SZ; j++)
  85.             sum += matrix[i][j];
  86.         if (sum > max) max = sum;
  87.         sum = 0;
  88.     }
  89.     return max;
  90. }
  91.  
  92. int RibsCount(int **matrix) {    // Функция-счетчик ребер в графе          
  93.     int count = 0;    // Сам счечтик
  94.     for (int i = 0; i <= SZ / 2; i++) {    // Идем лишь до половины размера, т.к. нет смысла проверять после 5 строки или столбца (просто будут повторяться и счечтик собъется)
  95.         for (int j = 0; j <= SZ / 2; j++)
  96.             if (matrix[i][j] == 1 && matrix[j][i] == 1) count++;   // Если, например [1,2] = 1 и [2,1] = 1 - то это ребро, так для всех остальных случаев
  97.     }
  98.     return count;
  99. }
  100.  
  101. int main() {
  102.     setlocale(LC_ALL, "Russian");    // Вывод русского языка в консоли
  103.     ifstream F("C:/Users/Артем/Desktop/Ribs.txt");    // Открываем поток для чтения из файла. В скобках введи свою директорию в таком же формате
  104.     int i, j, Vx;    // i, j - просто для циклов for, Vx - вершина, которую мы вводим с клавиатуры (для этого ребра надо выписать все смежные ему ребра)
  105.     cout << "Vx = "; cin >> Vx;
  106.     Vx--;   // Уменьшаем его на 1, т.к. элементы в матрице начинаются с 0, а вершины с 1
  107.     if (Vx > 9 || Vx < 0) {    // Просто проверка, чтобы не было введено кривое значение
  108.         cout << "Ошибка. Такого ребра нет.";
  109.         return 0;
  110.     }
  111.     int **RibsList = new int*[STR];    // Динамическая матрица для списка ребер, здесь создаются строки
  112.     int **AdjMatrix = new int*[SZ];    // Динамическая матрица смежности, тоже создаются строки
  113.     for (i = 0; i < STR; i++)
  114.         RibsList[i] = new int[COL];    // Выделение столбцов для списка ребер
  115.     for (i = 0; i < SZ; i++)
  116.         AdjMatrix[i] = new int[SZ];    // Выделение столбцов для матрицы смежности
  117.     if (F.is_open()) {    // Если файл открылся
  118.         while (!F.eof()) {    // То идем до конца файла
  119.             for (i = 0; i < STR; i++) {
  120.                 for (j = 0; j < COL; j++)
  121.                     F >> RibsList[i][j];    // Считываем поочередно элементы из файла в матрицу
  122.             }
  123.         }
  124.     }
  125.     cout << "Список ребер считан из файла: " << endl << endl;    // Выводим список ребер, считаный из файла
  126.     PrintList(RibsList);
  127.     AdjMatrixFill(AdjMatrix, RibsList);    // Заполняем с помощью списка ребер матрицу смежности
  128.     cout << endl << "Матрица смежности заполнена: " << endl << endl;
  129.     PrintAdjMatrix(AdjMatrix, Vx); cout << endl;
  130.     PrintAdjRibs(AdjMatrix, Vx); cout << endl;
  131.     cout << "Степень графа: " << GraphDeg(AdjMatrix) << endl << endl;
  132.     cout << "Количество ребер в графе: " << RibsCount(AdjMatrix) << endl << endl;
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement