You are on page 1of 36

Міністерство освіти і науки України

Національний університет “Львівська політехніка”


Інститут комп’ютерних наук та інформаційних технологій

Кафедра САП

Методичні вказівки до лабораторної роботи № 3


з дисципліни: “Дискретна математика”
на тему:
“Властивості графів. Операції над графами”

Затверджено на засiданнi кафедри


Системи автоматизованого проектування"
Протокол № 1 від 09.08.2022 р.

Львів-2022 р.
2

ВЛАСТИВОСТІ ГРАФІВ. ОПЕРАЦІЇ НАД ГРАФАМИ. Методичні вказівки до


лабораторної роботи № 3 з курсу “Дискретна математика” для студентів базового
напрямку “Комп’ютернi науки” / Укл. О. М. Станкевич. – Львiв: НУЛП, 2022. – 36 с.

Укладач: О. М. Станкевич
3
1. МЕТА РОБОТИ

Мета роботи – ознайомитись із можливостями системи Maple для вивчення


властивостей графів, виконання операцій над графами та знаходження найкоротшого
каркасу графа.

2. ТЕОРЕТИЧНI ВIДОМОСТI
2.1. Властивості графів.
Маршрути, шляхи та цикли
Маршрутом у заданому графі G = (V, Е) називається скінченна послідовність
його ребер, яка має вигляд (v0, v1), (v1, v2), ..., (vk-1, vk).
Кількість k ребер маршруту називають його довжиною. Часто можна зустріти
і таке означення маршруту в графі.
Послідовність вершин v0, v1, …, vk графа G = (V, Е) називають маршрутом,
який з’єднує вершини v0 і vk якщо (vi, vi+1)  E, i = 0, …, k − 1. В обох випадках
вершини v0, v1, …, vk називають вершинами маршруту.
Маршрут називають шляхом, якщо всі його ребра різні, і простим шляхом,
якщо всі його вершини, крім, можливо, першої і останньої, різні. Маршрут
називають циклічним або циклом, якщо перша і остання його вершини збігаються.
Маршрут називають простим циклом, якщо всі його вершини, крім, можливо,
першої і останньої, різні.
Граф називають ациклічним графом або лісом, якщо він не містить циклів.
Безпосередньо з означення маршруту і циклу випливають такі твердження.
Твердження 1. Будь-який маршрут, який з’єднує які-небудь дві вершини, має
простий шлях, що з’єднує ці вершини.
Твердження 2. Будь-який цикл в графі має простий цикл.
Приклад. Розглянемо граф, який має 5 вершин та 6 ребер:
4

Рис. 1.
Як можна пройти ребрами цього графа (рис. 1) з вершини 1 у вершину 5? Для
прикладу, можна вказати три послідовності ребер, рухаючись якими можна
потрапити із 1 в 5:
а) {1, 4}, {4, 5};
б) {1, 2}, {2, 4}, {4, 5};
в) {1, 4}, {4, 2}, {2, 1}, {1, 4}, {4, 5}.
Для створення простого циклу в пакеті Maple18 користуються функцією
CycleGraph(). На рисунку побудовано простий цикл на 8 вершинах:

Рис. 2
Зв’язність графа
Граф називають зв’язним, якщо будь-які дві його вершини зв’язані
маршрутом. Зв’язний підграф Н графа G називається максимальним, якщо Н не
міститься в жодному зв’язному підграфі графа G. Максимальний зв’язний підграф
5
графа називають компонентом зв’язності. Нехай G = {V, E} і H = {V1, E1} – задані
графи. Об’єднання графів G  H називають диз’юнктивним, якщо V  V1 = .
Теорема. Граф зв’язний тоді і тільки тоді, коли його не можна представити
у вигляді диз’юнктивного об’єднання двох графів.
Приклад. Розглянемо задачу: Чи може трапитись, що в одній компанії із шести
осіб кожний знайомий з двома і тільки двома іншими? Учасника цієї компанії
зобразимо вершиною графа, а відношення знайомства між двома учасниками –
ребром. Зобразимо графи, які можуть відповідати такій компанії.

Рис. 3.

Рис. 4.

Отже, ситуація, розглянута в задачі, цілком можлива (рис. 3). Але випадок,
розглянутий на рис. 4, відповідає не одній, а двом компаніям, де учасники однієї з
них не знайомі з учасниками іншої. Про граф, зображений на рис. 3 говорять, що він
6
зв’язний, оскільки з кожної вершини, рухаючись ребрами, можна потрапити в будь-
яку іншу вершину. Робимо висновок, що в цьому випадку кожен через своїх
знайомих може познайомитись зі всіма іншими. В іншому випадку (рис. 4) одержали
дві окремі частини, які не зв’язані між собою ребрами. Такий граф називають
незв’язним, а “частини” – компонентами зв’язності. Кожна компонента – зв’язний
граф. Функція ConnectedComponents() знаходить компоненти зв’язності графа,
виводячи списки усіх ребер кожної компоненти (рис. 5):

Рис. 5.
Інший приклад:

Рис. 6.
Приклад.
Між 9 планетами Сонячної системи введено космічне сполучення. Ракети
літають за таким маршрутом: Земля-Меркурій, Плутон-Венера, Земля-Плутон,
Плутон-Меркурій, Меркурій-Венера, Уран-Нептун, Нептун-Сатурн, Сатурн-Юпітер,
Юпітер-Марс і Марс-Уран. Чи можна добратися з Землі до Марса?
Починаючи від Сонця, планети нашої сонячної системи можна пронумерувати
так: 1 – Меркурій, 2 – Венера, 3 – Земля, 4 – Марс, 5 – Юпітер, 6 – Сатурн, 7 – Уран,
8 – Нептун, 9 – Плутон.
7
Тоді граф, який відображає задане в задачі космічне сполучення, матиме
ребра: (3, 1), (9, 2), (3, 9), (9, 1), (1, 2), (7, 8), (8, 6), (6, 5), (5,4 ), (4, 7).
Побудувавши цей граф, бачимо, він не зв’язний і складається з двох
компонент. Вершина 3 (Земля) та 4 (Марс) належать до різних компонент. Отже, за
заданого космічного сполучення добратися з Землі до Марса неможливо.

Щодо орієнтованого графа, то вводять поняття орієнтованого шляху – це


скінченна послідовність дуг S (e1 , e2 ,..., en ) . Довжиною шляху називають кількість
дуг, з яких він складається. Орієнтованим циклом називають орієнтований шлях,
який з’єднує вершину саму зі собою. Орієнтований шлях або цикл називають
простим, якщо жодна дуга не міститься в ньому більше одного разу.
Приклад. Для графа, зображеного на рисунку, наведемо приклади
орієнтованих шляхів з вершини v0 до вершини v6 : v0 v1v3v6 ; v0 v2 v5v6 ; v0 v4 v3v6 -
довжиною 3; v0 v2 v5v4 v3v6 - довжиною 5.

Для орієнтованого графа поняття зв’язності вводять по-різному, залежно від


того, чи враховано напрямок дуг.
8
Орієнтований граф називають сильно зв’язним, якщо для будь-яких його
різних вершин vi і vj існують орієнтовані шляхи від vi до vj та від vj до vi.
Орієнтований граф називають слабко зв’язним, якщо існує шлях між будь-
якими двома різними вершинами у відповідному йому неорієнтованому графі (тобто
без урахуванням напрямку дуг).
Зауважимо, що кожен сильно зв’язний граф є слабко зв’язним.
На рис. 7, а наведено приклад сильно зв’язного графу, а на рис. 7, б – слабко
зв’язного (не існує, наприклад, шляху між вершинами «1» та «2»).

а б
Рис. 7

Розглянемо два поняття, які визначають міру зв’язності графів.


Кількістю вершинної зв’язності κ(G) простого графа G називають найменшу
кількість вершин, вилучення яких утворює незв’язаний або одновершинний граф.
Зазначимо, що вершину вилучають разом із інцидентними до неї ребрами.
Кількістю реберної зв’язності λ(G) графа G називають найменшу кількість
ребер, вилучення яких дає незв’язаний граф. Число реберної зв’язності
одновершинного графа дорівнює 0.
Приклад. Для графа, зображеного на рисунку, число вершинної зв’язності
κ(G) = 1.
9
Наприклад, вилучення вершини v4 (або v5) разом із інцидентними ребрами
зробить граф G не зв’язним. Число реберної зв’язності λ(G) = 1, адже вилучення
ребра {v4,v5} зробить граф G не зв’язним.
Різновиди графів
Розглянемо декілька найвідоміших видів графів.
Граф, будь-які дві вершини якого суміжні, називається повним графом. Для
побудови повного графа слугує функція CompleteGraph(). Степінь вершини графа –
це кількість ребер, які до неї інцидентні. Граф, у якого усі вершини мають одну і ту
ж степінь r, називають регулярним графом (або регулярний граф степені r). Для
визначення степені вершини графа використовують функцію Degree().
Відомим прикладом регулярного графа є так званий граф Петерсена,
показаний на рис. 8. Для нього існує навіть спеціальна функція – PetersenGraph(),
для використання якої необхідно викликати пакет SpecialGraphs().

Рис. 8.

Серед регулярних графів особливо цікаві платонові графи – графи, утворені


вершинами і ребрами п’яти правильних многокутників – платонових тіл: тетраедра,
куба, октаедра, додекаедра і ікосаедра (рис. 9 і 10). Для побудови цих графів в
Maple18 є спеціальні функції: TetrahedronGraph(), HypercubeGraph(),
OctahedronGraph(), DodecahedronGraph(), IcosahedronGraph().
10

Рис. 9. Граф – тетраедр. Рис. 10. Граф – ікосаедр.

Припустимо, що множину вершин графа можна розбити на дві підмножини V1


і V2, які не перетинаються, так, що кожне ребро в G з’єднує яку-небудь вершину із V1
з якою-небудь вершиною із V2. Тоді G називають двочастковим графом (біграфом).
На рис. 11, б показано біграф, у якого V1 ={1, 2} і V2 ={3, 4, 5}, який отримали з
повного графа на рис.10, а.

а б
Рис. 11.

Якщо вершини двочасткового графа розфарбувати двома кольорами,


наприклад, червоним і синім, то будь-яке його ребро має один кінець червоний, а
другий – синій. Зауважимо, що в біграфі зовсім не обов’язково, щоб кожна вершина
із V1 була з’єднана з кожною вершиною із V2; якщо ж це так, то його називають
11
повним двочастковим графом (біграфом) і позначають через Km,n (m і n – кількість
вершин в V1 і V2). На рис. 12, а зображено граф K3,3.
Повний біграф вигляду K1,n називають зірковим графом (див. рис. 11, б – граф
K1,5).

а б
Рис. 12.

2.2. Операції над графами.


2.2.1. Видалення ребер з графа.
Для видалення ребра з графа використовують функцію DeleteEdge(). Під час
видалення ребра {А, В} із графа G одержують граф із тими ж вершинами, що і граф
G, і всіма ребрами, крім ребра {А, В}. Під час видалення ребра зі зв’язного графа,
новий граф може виявитися як зв’язним, так і незв’язним. Ребро {А, В} називають
мостом графа G, якщо в графі, одержаному після вилучення цього ребра з G,
вершини А і В стають незв’язними.
Приклад. На рис. 13 зображено вилучення ребра (1, 4) в графі H. У результаті
отримали два зв’язних графи.
12

Рис. 13.
2.2.2. Знаходження доповнення графа.
Функція GraphComplement() повертає доповнення до графа G, тобто граф з тим
самим набором вершин, що й G, але набір ребер (дуг) якого складається з ребер
(дуг), яких немає в G.
На рис. 14 подано послідовність команд для побудови циклічного графа K та
його доповнення – графа L, а також перелік ребер у кожному графі. На рис. 15
представлено їх графічне відображення.

Рис. 14.

а б
Рис. 15. Граф K (а) та його доповнення L (б).
13
2.2.3. Об’єднання графів.
Згідно з означенням об’єднанням графів G1 = (V1, E1) та G2 = (V2, E2)
називають граф G = (V, E) = G1 ∪ G2, в якому V = V1 ∪ V2 та E = E1 ∪ E2. Для
виконання цієї операції в Maple18 використовують функцію GraphUnion(). На
рис. 16 представлено приклад побудови доповнення до заданого графа.

Рис. 16.

Функція GraphJoin(G, H) повертає граф, отриманий шляхом з’єднання всіх


вершин G з усіма вершинами H. Мітки вершин в отриманому графі є рядками у
формі «1:u» та «2:v», де u – вершина в G, а v – вершина в H. На рис. 17 зображено
граф G, побудований на графах A та B з рис. 16.
14

Рис. 17.

2.2.4. Побудова матриці суміжності.


Таблицею (матрицею) суміжності R=[ri,j], графа G = (V, E) називають
квадратну матрицю порядку n (n – кількість вершин графа), елементи якої ri,j (i = 1, 2,
…n; j = 1, 2, …n) визначають так:

Для обчислення матриці суміжності в Maple18 слугує функція


AdjacencyMatrix(). Приклад її використання представлено на рис. 18.
15

Рис. 18.

2.3.5. Побудова матриці інцидентності.


Матриця інцидентності – одна з форм подання графа, в якій вказують
зв’язки між інцидентними елементами графа (ребро (дуга) і вершина). Стовпці
матриці відповідають ребрам, рядки – вершинам. Ненульове значення в клітинці
матриці вказує на зв’язок між вершиною і ребром (їх інцидентність).
IncidenceMatrix(G) повертає матрицю інцидентності графа G, в якій рядки
проіндексовані вершинами, а стовпці — ребрами G. Порядок ребер визначає
параметр Edges(G).
На рис. 19 показано побудову матриці інцидентності графа.
16

Рис. 19.

2.2.6. Визначення діаметра графа.


Діаметром зв’язного графа називають максимально можливу відстань між
двома його вершинами. Функція максимальної відстані між усіма парами вершин у
графі в системі Maple18 – Diameter(). На рис. 20 наведено приклад використання цієї
функції.
17

Рис. 20.

2.2.7. Найкоротший шлях між двома вершинами (без врахування ваг ребер).
Для знаходження найкоротшого шляху між двома вершинами без врахування
ваг ребер в програмі Maple18 використовують функцію ShortestPath(). Результатом є
список вершин у тому порядку, в якому вони з’являються на шляху. Якщо такого шляху
не існує, повертається помилка.
Наприклад, потрібно знайти найкоротший шлях між вершинами (1, 3) графа G,
зображеного на рис. 20. Серед можливих шляхів можна виокремити: 1 – {1, 4, 2, 5, 3},
2 – {1, 8 7, 6, 5, 3}, 3 – {1, 8, 2, 5, 3}. За кількістю вершин у шляху найкоротшими є 1-ий
та 3-ій, однак 1-ий шлях має коротшу довжину. На рис. 21 представлено результат
виконання команди ShortestPath().
Для визначення кількості ребер на найкоротшому шляху між двома вершинами
графа слугує функція Distance(). Якщо такого шляху не існує, результатом є
нескінченність. Стратегія полягає у використанні пошуку в ширину (BFS). У
наведеному вище прикладі найкоротший шлях включає 4 ребра (рис. 21).
18

Рис. 21.

2.3. Знаходження найкоротшого кістякового (каркасного) дерева графа.


Кістяк (каркас) – це таке дерево графа, яке є максимальним за включенням
ребер підграфом без циклів, і в якому сума довжин ребер мінімальна. Якщо вихідний
граф зв’язний, то буде побудовано кістяк, якщо ж у вихідному графі кілька
незв’язних компонент, то результатом буде кістяковий ліс.
Задача про знаходження мінімального кістякового дерева виникає під час
проектування ліній електропередач, трубопроводів, доріг тощо, коли потрібно задані
центри з’єднати деякою системою каналів зв’язку так, щоб будь-які два центри були
пов’язані або каналом що їх з’єднує, або через інші центри і канали, і щоб загальна
довжина (або, наприклад, вартість) каналів зв’язку була мінімальною. У цій ситуації
задані центри можна вважати вершинами графа з вагами ребер, що дорівнюють
довжинам (вартостям) каналів, які з’єднують ці центри. Тоді шукана мережа буде
кістяковим деревом найменшої довжини (вартості).
Оскільки граф з n вершинами містить n(n-2) різних кістякових дерев, то
розв’язання цієї задачі «сліпим» перебором варіантів вимагало б надзвичайно
19
великих обчислень навіть для відносно малих n. Однак для її розв’язання існують
ефективніші алгоритми, серед яких найвідоміші алгоритм Пріма та Крускала.
Для пошуку найкоротшого кістякового дерева в системі Maple18
використовують низку функцій:

де G – неорієнтований граф, зважений або незважений; w (необов’язковий) – назва,


animate (необов’язковий) – вказує, що замість дерева має бути повернута анімація
алгоритму. Якщо вказано необов’язковий параметр w, йому присвоюється вага
мінімального кістякового дерева. Якщо вказано літерал animate або animate=true,
замість мінімального кістякового дерева система повертатиме анімацію застосування
алгоритму.
MinimalSpanningTree, KruskalsAlgorithm і PrimsAlgorithm повертають кістякове
дерево неорієнтованого графа G з мінімально можливою вагою. Якщо граф G
незважений, вагу кожного ребра прирівнюють до 1.
Підпрограма PrimsAlgorithm використовує алгоритм Пріма для обчислення
мінімального кістякового дерева, а підпрограми KruskalsAlgorithm та
MinimalSpanningTree використовують алгоритм Крускала.
На рис. 22 зображено реалізацію функції PrimsAlgorithm з використанням
параметра animate (рис. 22, а) та без нього (рис. 22, б) та з параметром w – вага
мінімального кістякового дерева.
20

Рис. 22.

Встановлення інформаційного рівня infolevel[KruskalsAlgorithm] := 4 і


infolevel[PrimsAlgorithm] := 4 призводить до відображення системою деякої
інформації, яка вказує на кроки відповідних алгоритмів (Рис. 23).
21

Рис. 23

3. Типові контрольні запитання


1. Що таке маршрут у графі, довжина маршруту та його вершини?
2. Що таке ланцюг, простий ланцюг, цикл?
22
3. Що таке ациклічний граф?
4. Який граф називають зв’язним?
5. Що таке компонент зв’язності?
6. Який граф називається повним?
7. Як визначити степінь вершини графа?
8. Який граф називають регулярним?
9. Що таке двочастковий граф або біграф?
10.Функція для видалення ребра графа.
11.Функція для пошуку доповнення до заданого графа.
12.Функції об’єднання графів.
13.Що таке матриця суміжності?
14.Що таке матриця інцидентності графа?
15.Що таке діаметр зв’язного графа?
16.Функція знаходження найкоротшого шляху між двома вершинами.
17.Які найвідоміші алгоритми знаходження мінімального кістякового дерева
графа реалізовані в системі Maple18?

4. Завдання для виконання лабораторної роботи.


Тренувальні завдання. Виконайте в середовищі Maple18 наведені в теоретичній
частині приклади.
Виконайте завдання 4.1, 4.2, 4.3 згідно з вашим варіантом. Варіанти завдань
подано у ДОДАТКУ 1.
Завдання 4.1. Властивості графів.
1. Зобразити в робочому вікні Maple18 заданий граф (Див. ДОДАТОК 1).
2. Чи є зв’язний заданий граф? Якщо ні, то “дорисуйте” його так, щоб він став
зв’язним.
3. Побудуйте довільний граф та вкажіть за рисунком мости у ньому, якщо вони
існують.
23
4. Побудуйте дводольні графи Kn,m і Kp,l. Порахуйте кількість їх ребер і вершин.

Завдання 4.2. Операції над графами


1. Вилучити з заданого графа ребро (V3, V4).
2. Знайти доповнення до заданого графа.
3. Побудувати матриці суміжності та інцидентності графа.
4. Визначити діаметр заданого графа.
5. Знайти найкоротший шлях між вершинами A і B та кількість вершин у ньому.
6. Знайти об’єднання двох заданих графів.

Завдання 4.3. Знаходження найкоротшого кістякового дерева.


1. Задані у ДОДАТКУ 1 графи доповнити вагами ребер. Знайти найкоротше
кістякове дерево заданого графа за алгоритмом Пріма.
2. Знайти найкоротше кістякове дерево заданого графа за алгоритмом Крускала з
виведенням N його кроків.

4.4 Зміст звіту:


Титульний лист
Завдання 4.1. Скріншот виконаних завдань.
Завдання 4.2. Скріншоти виконаних завдань.
Завдання 4.3. Скріншоти виконаних завдань.
Висновок.

5. Список літератури

1. Rosen K.H. Exploring Discrete Mathematics with Maple. 1996. Exploring Discrete
Mathematics Using Maple (mheducation.com)
24
2. Журавчак Л. М. Дискретна математика для програмістів : навч. посіб. – Львів :
Львівська політехніка, 2019. – 420 с.
25
ДОДАТОК 1
Варіанти індивідуальних завдань

Варіанти графів для завдання 4.1(1 – 4), завдання 4.2(1 – 5), завдання 4.3
26
27
28
29
30

Варіанти вершин A та B для завдання 4.2(5)


1. A = V1; B = V5. 2. A = V1; B = V6. 3. A = V1; B = V8. 4. A = V8; B = V4.
5. A = V7; B = V3. 6. A = V1; B = V5. 7. A = V2; B = V5. 8. A = V3; B = V7.
9. A = V7; B = V3. 10. A = V4; B = V6. 11. A = V1; B = V9. 12. A = V1; B = V7.
13. A = V2; B = V8. 14. A = V3; B = V7. 15. A = V2; B = V5. 16. A = V1; B = V4.
17. A = V2; B = V6. 18. A = V1; B = V4. 19. A = V3; B = V6. 20. A = V1; B = V5.
21. A = V1; B = V9. 22. A = V5; B = V7. 23. A = V1; B = V4. 24. A = V2; B = V6.
25. A = V3; B = V7. 26. A = V3; B = V8. 27. A = V1; B = V4. 28. A = V1; B = V7.
29. A = V5; B = V11. 30. A = V2; B = V8. 31. A = V1; B = V5. 32. A = V1; B = V10.
31
Варіанти графів для завдання 4.2(6)
32
33
34
35
36

Варіанти дводольних графів Kn,m та Kp,l для завдання 4.1(6)

1. K2,5 і K7,4 2. K5,5 і K2,6 3. K3,7 і K5,2 4. K6,7 і K7,1


5. K1,5 і K4,8 6. K1,6 і K4,4 7. K4,9 і K8,4 8. K3,4 і K8,7
9. K3,6 і K1,4 10. K3,9 і K7,3 11. K1,7 і K7,3 12. K3,7 і K8,1
13. K4,7 і K5,2 14. K1,7 і K8,2 15. K4,8 і K9,3 16. K1,5 і K6,1
17. K3,7 і K2,4 18. K4,9 і K5,1 19. K6,8 і K7,5 20. K7,5 і K9,6
21. K4,5 і K1,9 22. K3,7 і K8,5 23. K1,6 і K7,2 24. K6,5 і K2,7
25. K6,5 і K5,4 26. K7,1 і K4,7 27. K5,2 і K1,9 28. K2,8 і K6,1
29. K3,5 і K8,6 30. K5,9 і K6,1 31. K6,8 і K9,3 32. K5,5 і K1,4

You might also like