Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
3.34 Кб
Скачать
{ graphs by boris }
{ Ља вз ©иЁҐ ЇгвЁ Ё§ ®¤­®Ј® Ёбв®Є  ў бҐвпе б ­Ґ®ваЁж вҐ«м­л¬Ё ўҐб ¬Ё ॡҐа }
{ Ђ«Ј®аЁв¬ „Ґ©Єбвал }
{ Њ ваЁж  ᬥ¦­®бвЁ }

const
  maxn = 100;                           { ¬ ЄбЁ¬ «м­®Ґ Є®«-ў® ўҐаиЁ­ }
  oo   = maxint div 2;                  { ЎҐбЄ®­Ґз­®бвм }

var
  a: array [1..maxn, 1..maxn] of integer; { ¬ ваЁж  ᬥ¦­®бвЁ }
  d: array [1..maxn] of longint;        { Єа вз ©иЁҐ ЇгвЁ }
  p: array [1..maxn] of integer;        { ¤ҐаҐў® Єа вз ©иЁе Їг⥩ (SPT) }
  v: array [1..maxn] of boolean;        { ЁбЇ®«м§®ў ­  «Ё ўҐаиЁ­  }
  n: longint;                           { Є®«-ў® ўҐаиЁ­ }

{ init: Ё­ЁжЁ «Ё§ жЁп Ё з⥭ЁҐ ¤ ­­ле }
procedure init;
var
  i, j, x, y, nn, z: longint;
begin
  for i := 1 to maxn do                 { Ја д ЎҐ§ ॡҐа }
    for j := 1 to maxn do
      a[i, j] := oo;

  fillchar(d, sizeof(d), 0);
  fillchar(p, sizeof(p), 0);
  fillchar(v, sizeof(v), false);        { ўҐаиЁ­л ­Ґ ЁбЇ®«м§®ў ­л }

  { з⥭ЁҐ ¤ ­­ле }
  assign(input, 'dijkstra.in');
{  assign(input, 'randw.in');}
  reset(input);

  read(n);
  read(nn);

  for i := 1 to nn do
  begin
    read(x, y, z);
    a[x, y] := z;
{    a[y, x] := z;}                       { Ґб«Ё ­Ґ®аЁҐ­вЁа®ў ­­л© Ја д }
  end;
end;

{ print: ЇҐз вм ¬ ваЁжл ¬Ґ¦­®бвЁ }
procedure print;
var
  i, j: integer;
begin
  writeln;
  writeln('Љ®«ЁзҐбвў® ўҐаиЁ­: ', n);
  writeln('Њ ваЁж  ᬥ¦­®бвЁ');
  for i := 1 to n do
  begin
    for j := 1 to n do
      if a[i, j] = oo then
        write('oo':3)
      else
        write(a[i, j]:3);
    writeln;
  end;
end;

{ dijkstra:  «Ј®аЁв¬ „Ґ©Єбвал }
procedure dijkstra(s: integer);
var
  i, j, min, m: integer;
begin
  for i := 1 to n do                    { ¤«п ўбҐе ўҐаиЁ­ }
  begin
    d[i] := a[s, i];                    { а ббв®п­ЁҐ ®в Ёбв®Є  }
    p[i] := s;                          { ЇаҐ¤®Є Ёбв®Є }
  end;

  d[s] := 0;                            { а ббв®п­ЁҐ ¤® Ёбв®Є  }
  p[s] := 0;                            { г Ёбв®Є  ­Ґв ЇаҐ¤Є®ў ў (SPT) }
  v[s] := true;                         { Ёбв®з­ЁЄ ЁбЇ®«м§®ў ­ }

  for i := 2 to n do                    { ¤«п ўбҐе ўҐаиЁ­ Єа®¬Ґ Ёбв®Є  }
  begin
    min := oo;                          { Ќ ©¤Ґ¬ ўҐаиЁ­г m б ¬Ё­Ё¬ «м­л¬ }
    for j := 1 to n do                  { а ббв®п­ЁҐ¬ ¤® Ёбв®Є  }
      if not v[j] and (d[j] < min) then
      begin
        min := d[j];
        m := j;
      end;

    v[m] := true;                       { ўҐаиЁ­  m ЁбЇ®«м§®ў ­  }

    for j := 1 to n do                  { ¤«п ўбҐе ўҐаиЁ­ }
      if not v[j] and                   { …б«Ё ўҐаиЁ­  ­Ґ ЁбЇ®«м§®ў ­  Ё }
         (d[j] > d[m]+a[m, j]) then     { зҐаҐ§ m ¬®¦­® ¤®©вЁ ¤® j Ўлбв॥ }
      begin
        d[j] := d[m] + a[m, j];         { 㬥­ми Ґ¬ а ббв®п­ЁҐ ®в Ёбв®Є  }
        p[j] := m;                      { Ё§¬Ґ­пҐ¬ ЇаҐ¤Є  j }
      end;
  end;
end;

{write_path: ЇЁиҐв Єа вз ©иЁ© Їгвм Ё§ s ў x }
procedure write_path(s, x: integer);
begin
  if x <> s then
    write_path(s, p[x]);

  write(x, ' ');
end;

begin
  init;
  writeln;
  writeln('Ља вз ©иЁҐ ЇгвЁ Ё§ ®¤­®Ј® Ёбв®Є  ў бҐвпе б ­Ґ®ваЁж вҐ«м­л¬Ё ўҐб ¬Ё ॡҐа');
  writeln('Ђ«Ј®аЁв¬ „Ґ©Єбвал');

  dijkstra(1);
  print;
  write('Ља вз ©иЁ© Їгвм Ё§ 1-®© ўҐаиЁ­л ў 4-го ўҐаиЁ­г: ');
  write_path(1, 4);
end.
Соседние файлы в папке shortest