Cod sursa(job #50225)

Utilizator VmanDuta Vlad Vman Data 7 aprilie 2007 01:05:08
Problema Radiatie Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.21 kb
program radiatie;
const Nmax=15000;
      Mmax=30000;
var a,b:array[1..Mmax]of integer;
    c:array[1..Mmax]of longint;
    t,h:array[1..Nmax]of integer;
    d:array[1..Nmax]of longint;
    n,m,k,i,x,y:integer;
    fin,fout:text;

procedure citire;
begin
assign(fin,'radiatie.in');reset(fin);
readln(fin,n,m,k);
for i:=1 to m do
    readln(fin,a[i],b[i],c[i]);
end;

procedure qsort(l,r:integer);
var i,j,m,aux:longint;
begin
i:=l;
j:=r;
m:=c[(i+j)div 2];
repeat
      while (c[i]<m) do inc(i);
      while (c[j]>m) do dec(j);
      if (i<=j) then begin
         aux:=a[i];a[i]:=a[j];a[j]:=aux;
         aux:=b[i];b[i]:=b[j];b[j]:=aux;
         aux:=c[i];c[i]:=c[j];c[j]:=aux;
         inc(i);
         dec(j);
      end;
until (i>j);
if (i<r) then qsort(i,r);
if (l<j) then qsort(l,j);
end;

function multime(nod:integer):integer;
begin
while (t[nod]<>nod) do
      nod:=t[nod];
multime:=nod;
end;

procedure merge_multimi(i,head1,head2:integer);
begin
if (h[head1]>h[head2]) then
   begin
   t[head2]:=head1;
   d[head2]:=c[i];
   end
   else if (h[head1]<h[head2]) then
        begin
        t[head1]:=head2;
        d[head1]:=c[i];
        end
        else begin
             inc(h[head1]);
             t[head2]:=head1;
             d[head2]:=c[i];
             end;
end;

procedure kruskal;
var head1,head2:integer;
begin
for i:=1 to n do begin
    t[i]:=i;
    h[i]:=1;
end;
for i:=1 to m do begin
    head1:=multime(a[i]);
    head2:=multime(b[i]);
    if (head1<>head2) then merge_multimi(i,head1,head2);
end;
end;

function get_max(x,y:integer):longint;
var maxx,xx,maxy:longint;
begin
maxx:=0;
maxy:=0;
xx:=x;
while ((t[x]<>x)and(x<>y)) do begin
      if (d[x]>maxx) then maxx:=d[x];
      x:=t[x];
end;
if (x=y) then begin get_max:=maxx;exit;end;
while ((t[y]<>y)and(y<>xx)) do begin
      if (d[y]>maxy) then maxy:=d[y];
      y:=t[y];
end;
if (y=xx) then begin get_max:=maxy;exit;end;
if (maxx>maxy) then get_max:=maxx else get_max:=maxy;
end;

begin
citire;
qsort(1,m);
kruskal;
assign(fout,'radiatie.out');rewrite(fout);
for i:=1 to k do begin
    readln(fin,x,y);
    writeln(fout,get_max(x,y));
end;
close(fout);
close(fin);
end.