Метод Краскала - 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.

Объяснение кода листинга программы

  1. В начале кода объявлены следующие переменные:
    • maxn - максимальное количество вершин в графе (100);
    • maxn_n - количество ребер графа (это maxn * (maxn - 1) / 2);
    • p - массив 3хmaxn_n для хранения координат ребер графа;
    • Mark - массив maxn для хранения номеров вершин;
    • k, i, t - вспомогательные переменные для работы алгоритма;
    • m, n - количество вершин и ребер графа соответственно.
  2. Далее идет процедура Change_Mark(l, m), которая меняет местами метки вершин с номерами l и m.
  3. После этого идет чтение из консоли количества вершин и ребер графа (n, m).
  4. Затем происходит чтение координат ребер графа в массив p.
  5. Далее происходит сортировка ребер графа по третьему полю (координаты вершин).
  6. После сортировки ребер графа происходит обход каждой вершины и присвоение ей номера (последовательно от 1 до n).
  7. Далее происходит обход графа по ребрам и поиск пар вершин с одинаковыми метками, которые нужно поменять местами с помощью процедуры Change_Mark(Mark[p[1, i]], Mark[p[2, i]]).
  8. В конце выводится информация о парах вершин, которые были поменяны местами.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы