Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2013
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Дискретна математика

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки, молоді та спорту України Національний університет „Львівська політехніка” Звіт З Лабораторної роботи №2 З дисципліни «Дискретна математика» Короткі теоретичні відомості ТЕОРЕТИЧНА ЧАСТИНА Задача про кістякове дерево екстремальної (мінімальної або максимальної) ваги При знаходженні кістякового дерева графа підхід із відкиданням ребер не є ефективним через те, що складно перевіряти наявність циклів в утворюваному графі. Ефективним є підхід із конструюванням (утворенням) кістяка. У цьому разі просто перевіряти наявність циклів в графі, що виникає. Вказаний підхід реалізує алгоритм Пріма (так званий алгоритм найближчого сусіда). Крок 1. Присвоєння початкових значень. S'={Xα}, Xα - довільна вершина графа (скажімо, перша за номером). S''= S\S', V' = Ø Крок 2. Оновлення даних. Знаходимо таке ребро (Xi, Xj), що Xi ϵ S', Xj ϵ S'' та W(Xi, Xj)= min{ W(Xα, Xβ)| Xα ϵ S', Xβ ϵ S''} Покладаємо S' = S' U { Xi }, S'' = S\S', V' = V'U{(Xi, Xj)} Крок 3. Перевірка на завершення. Якщо S' = S, то G' = (S', V') - шуканий граф. В іншому випадку переходимо на Крок 2. Далі наведено приклад виконання алгоритму Пріма. Граф задано списком ребер з вказанням їх ваг. (1,4|1), (4,1|1), (1,5|3), (5,1|3), (2,3|3), (3,2|3), (2,4|5), (4,2|5), (2,5|4), (5,2|4), (3,5|4), (5,3|4), (4,5|2), (5,4|2). Відповідний цьому списку граф / Спершу впорядковуємо ребра за зростанням їх ваг. Для цього слід використати якийсь алгоритм сортування. (1,4|1), (4,1|1), (4,5|2), (5,4|2), (1,5|3), (5,1|3), (2,3|3), (3,2|3), (2,5|4), (5,2|4), (3,5|4), (5,3|4), (2,4|5), (4,2|5). Тепер власне виконуємо алгоритм Пріма (додаючи для кожного кроку 2 ребро мінімальної ваги). S = {1,2,3,4,5} Крок 1. S' = {1} S'' = {2,3,4,5} V' = Ø Крок 2 . V' = V'U{(1,4|1)}={(1,4|1)} S' = {1,4} S'' = {2,3,5} Крок 3. S'≠S Крок 2. V' = V'U{4,5|2} = {(1,4|1), (4,5|2)} Крок 3. S'≠S Крок 2. V' = V'U {(5,2|4)} = {(1,4|1), (4,5|2), (5,2|4)} S' = {1,2,4,5} S'' = {3} Крок 3. S'≠S Крок 2. V' = V'U {(2,3|3)} = {(1,4|1), (4,5|2), (5,2|4), (2,3|3)} S' = {1,2,3,4,5} S'' = Ø Крок 3. S'=S Таким чином, отримали таке кістякове дерево мінімальної ваги для початкового графа. / Вага отриманого кістякового дерева дорівнює 10. Завдання (Варіант 5) Розробити програмне забезпечення , яке шукає найкоротшу відстань між вершинами графа. Враховуючи задані умови (не більше одного рівня глибини множини), код на мові програмування Basic. unit Pasik; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; Label1: TLabel; BitBtn2: TBitBtn; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure DrawLine(a1,a2,c: integer); procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure BitBtn2Click(Sender: TObject); procedure DrawGraph; private { Private declarations } public { Public declarations } end; TMyPoint=record x:integer; y:integer; name:string end; var Form1: TForm1; MyPoint:array[1..5] of TMyPoint; koef:integer; implementation {$R *.dfm} procedure TForm1.DrawGraph; var x,kx,ky,a,b:integer; begin Form1.Refresh; for x:=1 to 5 do begin kx:=MyPoint[x].x+koef; ky:=MyPoint[x].y+koef; Form1.Canvas.Ellipse(kx,ky,kx+10,ky+10); Form1.Canvas.TextOut(kx,ky-15,MyPoint[x].name); end; for a:=2 to 5 do for b:=1 to a-1 do if ((StringGrid1.Cells[b,a]<>'') and (StrtoInt(StringGrid1.Cells[b,a])>0)) then DrawLine (a,b,1); end; procedure TForm1.DrawLine(a1,a2,c: integer); var x1,y1,x2,y2:integer; begin if c=1 then Form1.Canvas.Pen.Color:=clBlack; if c=2 then Form1.Canvas.Pen.Color:=clRed; x1:=MyPoint[a1].x+koef+5; y1:=MyPoint[a1].y+koef+5; Form1.Canvas.MoveTo(x1,y1); x2:=MyPoint[a2].x+koef+5; y2:=MyPoint[a2].y+koef+5; Form1.Canvas.LineTo(x2,y2); Form1.Canvas.Pen.Color:=clBlack; end; procedure TForm1.FormCreate(Sender: TObject); var x:integer; begin StringGrid1.Cells[1,0]:='A'; StringGrid1.Cells[2,0]:='B'; StringGrid1.Cells[3,0]:='C'; StringGrid1.Cells[4,0]:='D'; StringGrid1.Cells[5,0]:='E'; StringGrid1.Cells[0,1]:='A'; StringGrid1.Cells[0,2]:='B'; StringGrid1.Cells[0,3]:='C'; StringGrid1.Cells[0,4]:='D'; StringGrid1.Cells[0,5]:='E'; for x:=1 to 5 do StringGrid1.Cells[x,x]:='X'; MyPoint[1].x:=10; MyPoint[1].y:=70; MyPoint[1].name:='A'; MyPoint[2].x:=20; MyPoint[2].y:=30; MyPoint[2].name:='B'; MyPoint[3].x:=70; MyPoint[3].y:=80; MyPoint[3].name:='C'; MyPoint[4].x:=90; MyPoint[4].y:=20; MyPoint[4].name:='D'; MyPoint[5].x:=120; MyPoint[5].y:=50; MyPoint[5].name:='E'; DrawGraph; koef:=50; end; procedure TForm1.FormPaint(Sender: TObject); var x,kx,ky:integer; begin for x:=1 to 5 do begin kx:=MyPoint[x].x+koef; ky:=MyPoint[x].y+koef; Form1.Canvas.Ellipse(kx,ky,kx+10,ky+10); Form1.Canvas.TextOut(kx,ky-15,MyPoint[x].name); end; end; procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin if ACol=ARow then begin StringGrid1.Cells[ACol,ARow]:='X'; Exit; end; if StringGrid1.Cells[ACol,ARow]=Value then begin StringGrid1.Cells[ARow,ACol]:= Value ; DrawGraph; end; end; procedure TForm1.BitBtn2Click(Sender: TObject); //main var a:array[1..5,1..5] of integer; t,min,x,y,u,i,j,k,n:longint; b,c:array[1..5] of integer; begin for i:=2 to 5 do for j:=1 to i-1 do if ((StringGrid1.Cells[j,i]<>'') and (StrtoInt(StringGrid1.Cells[j,i])>0)) then n:=i; for i:=1 to 5 do for j:=1 to 5 do if (StringGrid1.Cells[i,j]='') or (StringGrid1.Cells[i,j]='X') then a[i,j]:=32000 else a[i,j]:=StrToInt(StringGrid1.Cells[i,j]); for i:=1 to 5 do begin c[i]:=0; b[i]:=0; end; k:=0; u:=1; c[1]:=1; b[u]:=1; while u<n do begin min:=32000; for i:=1 to u do if b[i]>0 then begin t:=b[i]; for j:=1 to n do if (a[t,j]<min) and (c[j]=0) then begin min:=a[t,j]; y:=t; x:=j; end; end; inc(u); b[u]:x; c[x]:=1; k:=k+a[y,x]; DrawLine (x,y,2); a[y,x]:=32000; a[x,y]:=32000; end; Label2.Caption:='Ðåçóëüòàò: '+IntToStr(k); end; end.
Антиботан аватар за замовчуванням

06.04.2015 11:04-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!