You are on page 1of 8

Національний технічний університет України «КПІ ім.

Ігоря Сікорського»
Факультет інформатики та обчислювальної техніки
Кафедра інформаційних систем та технологій

Лабораторна робота №3
з дисципліни «СРМ-1. Дискретна математика»

на тему

«Операції над матрицями графів»

Виконала: Гребенюк Софія


Студентка гр. ІС-11
Викладач:
доц. Рибачук Л.В.

Київ – 2021
Зміст
Зміст............................................................................................................................2
1 Постановка задачі..................................................................................................3
2 Результати виконання програми...........................................................................4
3 Лістинг програми.....................................................................................................5
1 Постановка задачі

Реалізувати програмне застосування (програму), яке виконує


наступні функції. Причому на вхід програми подається вхідний файл з
описом графу, зі структурою, яка вказана у практичному завданні №1
«Представлення графів».

1. Визначити матриці відстаней та досяжності графу. Програма за


запитом користувача виводить на екран та/або у файл матрицю
відстаней D та матрицю досяжності R графу.

2. Визначити наявність простих циклів у графі. Програма визначає


чи наявні у графі прості цикли та, в разі позитивної відповіді, виводить
деякі цикли на екран.

3. Визначити тип зв’язності графу. Програма виводить на екран тип


зв’язності графу.

З файлу зчитуються такі значення:

69
15
16
21
23
34
46
54
56
61
2 Результат виконання програми
3 Лістинг програми
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <windows.h>
#pragma warning(disable:4996)

using namespace std;

int** sym(int, int, int**, int**);


int** mnozennya(int** symiznist, int **multi, int size);
void zvyazok(int** dosyaznist, int** dosTransp, int** symiznist, int size);
void PrintCycle(int n, int m);

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream inputFile("graph.txt");
int n, m;
int multiply, mult = 0;
inputFile >> n >> m;
int** array;
array = new int* [m];
for (int i = 0; i < m; i++) {
array[i] = new int[0];
}
for (int i = 0; i < m; i++) {
inputFile >> array[i][0] >> array[i][1];
}
inputFile.close();

cout << "З файлу було зчитано такі значення: " << endl;
for (int i = 0; i < m; i++) {
cout << array[i][0] << " " << array[i][1] << endl;
}

int** symiznist = new int* [n + 1]; //розмір матриці - n x n

for (int i = 0; i < n + 1; i++) {


symiznist[i] = new int[n + 1];
}
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < n + 1; j++) {
symiznist[i][j] = 0;
}
}

sym(n, m, array, symiznist);

/*cout << endl << "Матриця суміжності: " << endl;


cout << "_";
for (int j = 1; j < n + 1; j++) {
cout << setw(6) << "v" << j;
}
cout << endl;
for (int i = 1; i < n + 1; i++) {
cout << "v" << i;
for (int j = 1; j < n + 1; j++) {
cout << setw(6) << symiznist[i][j] << " ";
}
cout << endl;
}*/

//-----Матриця відстаней-----//
int** multi = new int* [n + 1];
for (int i = 0; i < n + 1; i++) {
multi[i] = new int[n + 1];
}

for (int i = 0; i < n + 1; i++) {


for (int j = 0; j < n + 1; j++) {
multi[i][j] = 0;
}
}

int** vidstan = new int* [n + 1];

for (int i = 0; i < n + 1; i++) {


vidstan[i] = new int[n + 1];
}

for (int i = 0; i < n + 1; i++) {


for (int j = 0; j < n + 1; j++) {
vidstan[i][0] = i;
vidstan[0][j] = j;
}
}

vidstan = symiznist;
multi = symiznist;

for (int i = 2; i < n + 1; i++) {


multi = mnozennya(multi, symiznist, n);
for (int j = 1; j < n + 1; j++) {
for (int k = 1; k < n + 1; k++) {
if ((multi[j][k]!=0) && (vidstan[j][k]==0) && (j!=k))
vidstan[j][k] = i;
}
}
}
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
if (i = j)
vidstan[i][j] = 0;
}
}

for (int i = 1; i < n + 1; i++) {


for (int j = 1; j < n + 1; j++) {
if (vidstan[i][j] == 0 && (i != j))
vidstan[i][j] = 100;
}
}

char choice;
cout << "Показати матрицю відстаней?(y/n) ";
cin >> choice;
if (choice == 'y') {
cout << endl << "Матриця відстаней (100 - нескінченність): " << endl;
cout << "_";
for (int j = 1; j < n + 1; j++) {
cout << setw(6) << "v" << j;
}
cout << endl;
for (int i = 1; i < n + 1; i++) {
cout << "v" << i;
for (int j = 1; j < n + 1; j++) {
cout << setw(6) << vidstan[i][j] << " ";
}
cout << endl;
}
}

//-----Матриця досяжності-----//
int** dosyaznist = new int* [n + 1];
for (int i = 0; i < n + 1; i++) {
dosyaznist[i] = new int[n + 1];
}
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < n + 1; j++) {
dosyaznist[i][j] = 0;
}
}

for (int i = 0; i < n + 1; i++) {


for (int j = 0; j < n + 1; j++) {
if (vidstan[i][j] >= 0 && vidstan[i][j]!=100)
dosyaznist[i][j] = 1;
else dosyaznist[i][j] = 0;
}
}
cout << endl << "Показати матрицю досяжності?(y/n) ";
cin >> choice;
if (choice == 'y') {
cout << endl << "Матриця досяжності: " << endl;
cout << "_";
for (int j = 1; j < n + 1; j++) {
cout << setw(6) << "v" << j;
}
cout << endl;
for (int i = 1; i < n + 1; i++) {
cout << "v" << i;
for (int j = 1; j < n + 1; j++) {
cout << setw(6) << dosyaznist[i][j] << " ";
}
cout << endl;
}
}

int** dosTransp = new int* [n + 1];


for (int i = 0; i < n + 1; i++) {
dosTransp[i] = new int[n + 1];
}

//dosTransp = transp(dosTransp, dosyaznist, n);


zvyazok(dosyaznist, dosTransp, sym(n, m, array, symiznist), n);

int** sym(int n, int m, int** array, int** symiznist) {


//------Матриця суміжності---------//

int p, t;
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < n + 1; j++) {
symiznist[i][0] = i;
symiznist[0][j] = j;
}
}
for (int i = 0; i < m; i++) {
p = array[i][0];
t = array[i][1];
symiznist[p][t] = 1;
}
return symiznist;
}
int** mnozennya(int **multi, int **symiznist, int size) {
int** multiplied = new int* [size + 1];
for (int i = 0; i < size + 1; i++) {
multiplied[i] = new int[size + 1];
}

for (int i = 0; i < size + 1; i++) {


for (int j = 0; j < size + 1; j++) {
multiplied[i][j] = 0;
}
}

for (int i = 1; i < size + 1; i++) {


for (int j = 1; j < size + 1; j++) {
for (int k = 1; k < size + 1; ++k) {
multiplied[i][j] += symiznist[i][k] * multi[k][j];
}
}
}
return multiplied;
}

void zvyazok(int** dosyaznist, int** dosTransp,int** symiznist, int size) {


bool flag = true;
for (int i = 0; i < size+1; i++) {
for (int j = 0; j < size+1; j++) {
if (dosyaznist[i][j] != 1)
flag = false;
}
}
if (flag == false) {
flag = true;
for (int i = 0; i < size + 1; i++) {
for (int j = 0; j < size + 1; j++) {
if (i != j) {
if (dosyaznist[i][j] == 0 && dosyaznist[j][i] == 0)
flag = false;
}

}
}
if (flag == false) {
flag = true;
for (int i = 0; i < size + 1; i++) {
for (int j = 0; j < size + 1; j++) {
if (i != j) {
if (symiznist[i][j] != 1)

flag = false;
}
}
}
if (flag == false)
cout << endl << "Граф незв'язний" << endl;
else
cout << endl << "Граф слабко-зв'язний" << endl;
}
else cout << endl << "Граф однобiчно-зв'язний" << endl;

}
else cout << endl << "Граф сильно-зв'язний" << endl;
}

You might also like