Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы на графах / mst / kruskal
.pas{ graphs by boris }
{ minimal spanning tree (Kruskal's algorithm) }
const
maxn = 100; {}
maxm = 10000; {}
inf = maxint div 2; {}
type
edge = record
x, y: integer; { ўҐаиЁл ॡа }
w: integer; { ўҐб ॡа }
end;
var
a: array [1..maxm] of edge; { бЇЁб®Є ॡҐа }
s: array [1..maxn] of integer; { а §¬Ґа Є®¬Ї®Ґв бўп§®бвЁ }
r: array [1..maxn] of integer; { бўп§Ё ўҐаиЁ ў Є®¬Ї®Ґв е бўп§®бвЁ }
n, m: longint; { Є®«-ў® ўҐаиЁ Ё ॡҐа }
mst_weight: longint; { ўҐб MST}
{ ЁЁжЁ «Ё§ жЁп Ё з⥨Ґ ¤ ле }
procedure init;
var
i, j, x, y, nn, z: longint;
begin
mst_weight := 0;
assign(input, 'mst.in');
{ assign(input, 'randw.in');}
reset(input);
read(n);
read(m);
for i := 1 to m do
begin
read(x, y, z);
a[i].x := x;
a[i].y := y;
a[i].w := z;
end;
end;
{ ®Ў¬Ґ ¤ўге ॡҐа (¤«п б®авЁа®ўЄЁ) }
procedure swap(var e1, e2: edge);
var
e: edge;
begin
e := e1; e1 := e2; e2 := e;
end;
{ а ¤®¬Ё§Ёа®ў п Ўлбва п б®авЁа®ўЄ }
procedure qsort(l, r: integer);
var
i, j, x: integer;
begin
i := l; { i - «Ґў п Ја Ёж }
j := r; { j - Їа ў п Ја Ёж }
x := a[l+random(r-l+1)].w; { x - б«гз ©л© н«Ґ¬Ґв Ё§ ЁвҐаў « }
repeat
while x > a[i].w do inc(i); { ЁйҐ¬ н«Ґ¬Ґв Ў®«миЁ© Ў амҐа }
while x < a[j].w do dec(j); { ЁйҐ¬ н«Ґ¬Ґв ¬ҐмиЁ© Ў амҐа }
if i <= j then { гЄ § ⥫Ё Ґ ЇҐаҐбҐЄЄ«Ёбм }
begin
swap(a[i], a[j]); { ¬ҐпҐ¬ н«Ґ¬Ґвл }
inc(i); { Їа®¤ўЁЈ Ґ¬ «Ґўл© гЄ § ⥫м }
dec(j); { Їа®¤ўЁЈ Ґ¬ Їа ўл© гЄ § ⥫м }
end;
until i > j; { ¤® ЇҐаҐбҐзҐЁп гЄ § ⥫Ґ© }
if l < j then qsort(l, j); { б®авЁа㥬 «Ґўл© Ї®¤¬ ббЁў }
if i < r then qsort(i, r); { б®авЁа㥬 Їа ўл© Ї®¤¬ ббЁў }
end;
{ Ї®бв஥ЁҐ mst ( «Ј®аЁв¬ ЉагбЄ « ) }
procedure kruskal;
var
k, i, p, q: integer;
begin
qsort(1, m); { б®авЁа㥬 бЇЁб®Є ॡҐа Ї® ҐгЎлў Ёо }
for i := 1 to n do { жЁЄ« Ї® ўҐаиЁ ¬ }
begin
r[i] := i; { г ўҐаиЁ бў®п Є®¬Ї®Ґв бўп§®бвЁ }
s[i] := 1; { а §¬Ґа Є®¬Ї®Ґвл бўп§®бвЁ }
end;
k := 0; { ®¬Ґа ЇҐаў®Ј® ॡа + 1 }
for i := 1 to n - 1 do { жЁЄ« Ї® аҐЎа ¬ mst }
begin
repeat { ЁйҐ¬ аҐЎа Ё§ а §ле }
inc(k); { Є®¬Ї®Ґв бўп§®бвЁ }
p := a[k].x;
q := a[k].y;
while r[p] <> p do { ЁйҐ¬ Є®аҐм ¤«п p }
p := r[p];
while r[q] <> q do { ЁйҐ¬ Є®аҐм ¤«п q }
q := r[q];
until p <> q;
writeln(a[k].x, ' ', a[k].y); { ўлў®¤ ॡа }
inc(mst_weight, a[k].w);
if s[p] < s[q] then { ў§ўҐиҐ®Ґ ®ЎкҐ¤ЁҐЁҐ }
begin { Є®¬Ї®Ґвл бўп§®бвЁ }
r[p] := q;
s[q] := s[q] + s[p];
end
else
begin
r[q] := p;
s[p] := s[p] + s[q];
end;
end;
end;
begin
init;
writeln('minimal spanning tree (Kruskal''s algorithm)');
kruskal;
writeln('mst weight = ', mst_weight);
end.
Соседние файлы в папке mst