Федюк_Фес-32_лаб9_СПП

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 4

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

національний університет імені Івана Франка


Факультет електроніки та комп’ютерних технологій

Звіт

про виконання лабораторної роботи


№9:

Реалізація та оптимізація алгоритму Краскала

Виконав:
Студент групи ФеС-32
Федюк Ростислав
Перевірив:
Доц. Франів В. А.

Львів-2024
Завдання:

Реалізація та оптимізація алгоритму Краскала в Lisp Код програми:

Висновок: Лабораторна робота реалізувала алгоритм


Краскала для пошуку мінімального остовного дерева
графа у мові програмування Lisp. Алгоритм був успішно
реалізований, і його виведення надає список ребер
мінімального остовного дерева графа. Ця лабораторна
допомагає зрозуміти роботу алгоритму Краскала та
практично застосовувати його для пошуку
оптимальних рішень у задачах теорії графів.

Код програми
;; Представлення графа у вигляді списку ребер (вага, початкова вершина, кінцева
вершина)
(defparameter *edges* '((7 0 1) (5 0 3) (8 1 2) (7 1 3) (9 1 4) (5 2 4) (6 3 4) (8 3 5) (9 4 5)))

;; Сортування списку ребер за зростанням ваги


(defun sort-edges (edges)
(sort edges #'< :key #'first))

;; Знаходження представника множини


(defun find-representative (x parent)
(if (= x (aref parent x))
x
(find-representative (aref parent x) parent)))

;; Об'єднання двох множин


(defun union-sets (x y parent rank)
(when (and x y)
(let ((x-root (find-representative x parent))
(y-root (find-representative y parent)))
(cond
((= x-root y-root) nil)
((< (aref rank x-root) (aref rank y-root))
(setf (aref parent x-root) y-root))
((> (aref rank x-root) (aref rank y-root))
(setf (aref parent y-root) x-root))
(t
(setf (aref parent y-root) x-root)
(incf (aref rank x-root)))))))

;; Алгоритм Краскала
(defun kruskal (edges num-vertices)
(let ((sorted-edges (sort-edges edges))
(parent (make-array num-vertices :initial-element 0))
(rank (make-array num-vertices :initial-element 0))
(mst '()))
(dotimes (i num-vertices)
(setf (aref parent i) i))
(dolist (edge sorted-edges)
(multiple-value-bind (weight u v) edge
(unless (union-sets u v parent rank)
(push edge mst))))
mst))

;; Приклад використання
(let ((num-vertices 6))
(format t "Minimum Spanning Tree: ~a~%" (kruskal *edges* num-vertices)))

You might also like