Метод Краскала - PascalABC.NET
Формулировка задачи:
Почему не работает, чего не хватает
Не понимаю , чего не хватает в программе . Метод Краскала. Объесните что надо вводить для проверки работы программы.
Решение задачи: «Метод Краскала»
textual
Листинг программы
const maxn = 100; maxn_n = maxn * (maxn - 1) div 2; var p: array [1..3, 1..maxn_n]of integer; Mark: array [1..maxn]of integer; k, i, t: integer; m, n: integer; procedure Change_Mark(l, m: integer); var i, t: integer; begin if m < l then begin t := l; l := m; m := t; end; for i := 1 to n do if Mark[i] = m then Mark[i] := l; end; begin readln(n, m); for i := 1 to m do read(p[1, i], p[2, i], p[3, i]); for i := 1 to m - 1 do for t := i + 1 to m do if p[3, i] > p[3, t] then begin k := p[1, i];p[1, i] := p[1, t];p[1, t] := k; k := p[2, i];p[2, i] := p[2, t];p[2, t] := k; k := p[3, i];p[3, i] := p[3, t];p[3, t] := k; end; for i := 1 to n do mark[i] := i; k := 0; t := m; while k < n - 1 do begin i := 1; while (i <= t) and (Mark[p[1, i]] = Mark[p[2, i]]) and (p[1, i] <> 0) do inc(i); inc(k); if p[1, i] * p[2, i] <> 0 then begin write(p[1, i], ' ', p[2, i], ' '); change_Mark(Mark[p[1, i]], Mark[p[2, i]]); end; end; end.
Объяснение кода листинга программы
- В начале кода объявлены следующие переменные:
maxn
- максимальное количество вершин в графе (100);maxn_n
- количество ребер графа (это maxn * (maxn - 1) / 2);p
- массив 3хmaxn_n для хранения координат ребер графа;Mark
- массив maxn для хранения номеров вершин;k, i, t
- вспомогательные переменные для работы алгоритма;m, n
- количество вершин и ребер графа соответственно.
- Далее идет процедура
Change_Mark(l, m)
, которая меняет местами метки вершин с номерами l и m. - После этого идет чтение из консоли количества вершин и ребер графа (n, m).
- Затем происходит чтение координат ребер графа в массив
p
. - Далее происходит сортировка ребер графа по третьему полю (координаты вершин).
- После сортировки ребер графа происходит обход каждой вершины и присвоение ей номера (последовательно от 1 до n).
- Далее происходит обход графа по ребрам и поиск пар вершин с одинаковыми метками, которые нужно поменять местами с помощью процедуры
Change_Mark(Mark[p[1, i]], Mark[p[2, i]])
. - В конце выводится информация о парах вершин, которые были поменяны местами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д