Cod sursa(job #380621)

Utilizator cristinabCristina Brinza cristinab Data 6 ianuarie 2010 22:31:57
Problema Arbore partial de cost minim Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.67 kb
{apm kruskal cu paduri}

type muchie=record
            x,y:longint;
            c:integer;
            end;

var u:array[1..200000] of muchie;
    tata,h:array[1..400000] of longint;
    sol:array[1..200000,1..2] of longint;
    n,m,k,cost:longint;

procedure citire;
var i:longint;
begin
assign(input,'apm.in'); reset(input);
readln(n,m);
for i:=1 to m do readln(u[i].x,u[i].y,u[i].c);
close(input);
end;

procedure qsort(l,r:longint);
var i,j:longint;
    x:integer;
    aux:muchie;
begin
i:=l;
j:=r;
x:=u[(i+j) div 2].c;

repeat
 while u[i].c<x do inc(i);
 while x<u[j].c do dec(j);

 if i<=j then
    begin
    aux:=u[i];
    u[i]:=u[j];
    u[j]:=aux;
    inc(i);
    dec(j);
    end;
until i>j;

if i<r then qsort(i,r);
if j>l then qsort(l,j);
end;

function radacina(x:longint):longint;
var rad:longint;
begin

rad:=x;

while tata[rad]<>0 do rad:=tata[rad];

radacina:=rad;

end;

procedure unificare(x,y:longint);
begin
if h[x]>h[y] then tata[y]:=x
             else tata[x]:=y;
if h[x]=h[y] then inc(h[y]);
end;

procedure kruskal;
var i,im,jm:longint;
begin

k:=0;
cost:=0;

while k<n-1 do
      begin
      im:=radacina(u[i].x);
      jm:=radacina(u[i].y);
      if im<>jm then
         begin
         cost:=cost+u[i].c;
         inc(k);
         sol[k,1]:=u[i].x;
         sol[k,2]:=u[i].y;
         unificare(im,jm);
         end;
      inc(i);
      end;
end;

procedure afisare;
var i:longint;
begin
assign(output,'apm.out'); rewrite(output);
writeln(cost);
writeln(k);
for i:=1 to k do writeln(sol[i,1],' ',sol[i,2]);
close(output);
end;

begin
citire;
qsort(1,m);
kruskal;
afisare;
end.