You are on page 1of 10

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

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

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

на тему

«Характеристики графів»

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


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

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

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


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

1. Визначити степінь вершин графу. За запитом користувача


програма на екран та/або у файл виводить степінь усіх вершин графу
(напівстепені виходу та заходу). Визначити, чи граф є однорідним та
якщо так, то вказати степінь однорідності графу.

2. Визначити всі висячі та ізольовані вершини. За запитом


користувача програма на екран виводить перелік усіх висячих та
ізольованих вершин графу.

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


наступні характеристики:

a. Діаметр графу
b. Радіус графу
c. Центр графу
d. Яруси графу із переліком вершин, які входять до кожного ярусу
2 Результати виконання програми
З файлу зчитується кількість вершин та ребер графу. Граф заданий списком
ребер.

E5 E7
5
E4

1 E2 E3 4
E6
E1
E1

2 3

Рис. графу
3 Лістинг програми
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream inputFile("graph.txt");
int n, m;
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;
}

//Матриця інцидентності буде розмірності n x m


int p, t;
int** incid = new int* [n + 1];
for (int i = 0; i < n + 1; i++) {
incid[i] = new int[m + 1];
}
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < m + 1; j++) {
incid[i][j] = 0;
}
}
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < m + 1; j++) {
incid[i][0] = i;
incid[0][j] = j;
}
}
for (int i = 0; i < m; i++) {
p = array[i][0];
t = array[i][1];
if (p == t)
incid[p][i + 1] = 2;
else if (p != t) {
incid[t][i + 1] = 1;
incid[p][i + 1] = -1;
}
}

//------Матриця суміжності---------//
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;
}
}
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;
}
cout << "Матриця інцидентності: " << endl;
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < m + 1; j++) {
cout << setw(4) << incid[i][j] << " ";
}
cout << endl;
}
cout << endl << "Матриця суміжності: " << endl;
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < n + 1; j++) {
cout << setw(4) << symiznist[i][j] << " ";
}
cout << endl;
}

char choice;

int* stepin = new int[n];


for (int i = 0; i < n; i++) {
stepin[i] = 0;
for (int j = 1; j < m + 1; j++) {
if (incid[i + 1][j] != 0)
stepin[i]++;
}
}

cout << "Вивести степінь вершин? (y/n)? ";


cin >> choice;
if (choice == 'y') {
int vyhid;
for (int i = 0; i < n + 1; i++) {
vyhid = 0;
for (int j = 1; j <= n; j++) {
if (symiznist[i][j] == 1) {
vyhid++;
}
}
if (i >= 1)
cout << "Півстепінь виходу " << i << " вершини: " << vyhid <<
endl;
}
cout << endl;

int vhid;
for (int i = 0; i < n + 1; i++) {
vhid = 0;
for (int j = 1; j <= n; j++) {
if (symiznist[j][i] == 1) {
vhid++;
}
}
if (i >= 1)
cout << "Півстепінь входу " << i << " вершини: " << vhid << endl;
}
cout << endl;

int counter = 0;
for (int i = 0; i < n; i++) {
cout << "Степінь " << i + 1 << " вершини: " << stepin[i] << endl;
if (stepin[i] == stepin[i+1])
counter++;
}
if (counter == n)
cout << endl << "Граф однорідний" << endl;
else cout << endl << "Граф неоднорідний" << endl;
}

cout << "Показати ізольовані/висячі вершини? (y/n) ";


cin >> choice;
if (choice == 'y') {
for (int i = 0; i < n; i++) {
if (stepin[i] == 0) {
cout << "Ізольовані вершини: ";
cout << i + 1 << " ";
}
if (stepin[i] == 1) {
cout << endl << "Висячі вершини: ";
cout << i + 1 << " ";
}
}
}

system("pause>0");
}

You might also like