
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы на графах / shortest / dijksmat
.pas{ 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