Cod sursa(job #8838)

Utilizator vanila0406Ionescu Victor vanila0406 Data 25 ianuarie 2007 18:23:15
Problema Radiatie Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 6.47 kb
program radiatie;
type rad=record
        x,y,c:longint;
end;
var f,g:text;
        n,m,k,x,y,maxim:longint;
        v,vu:array[1..30000] of rad;
        l:array[1..15001] of longint;
        viz:array[1..15001] of longint;



procedure iofile;
var i,j,x,y,c:longint;
begin
        assign(f,'radiatie.in');
        reset(f);
        assign(g,'radiatie.out');
        rewrite(g);
        readln(f,n,m,k);
        for i:=1 to m do
                begin
                        readln(f,v[i].x,v[i].y,v[i].c);
                end;
end;


procedure pozitie(var m:longint;p,u:longint);
var di,dj,i,j,aux:longint;
        aux1:rad;
begin
        di:=0;
        dj:=-1;
        i:=p;
        j:=u;
        while i<j do
                begin
                        if v[i].c>v[j].c then
                                begin
                                        aux:=di;
                                        di:=-dj;
                                        dj:=-aux;
                                        aux1:=v[i];
                                        v[i]:=v[j];
                                        v[j]:=aux1;
                                end;
                        i:=i+di;
                        j:=j+dj;
                end;
        m:=i;
end;


procedure quick(p,u:longint);
var m:longint;
begin
        if p<u then
                begin
                        pozitie(m,p,u);
                        quick(p,m-1);
                        quick(m+1,u);
                end;
end;


procedure kruskal;
var i,nr,e1,e2,j:longint;
begin
        nr:=1;
        quick(1,m);
        for i:=1 to n do
                l[i]:=i;
        i:=2;
        vu[nr]:=v[1];
        while (nr<n-1)and(i<=m) do
                begin
                        if l[v[i].x]<>l[v[i].y] then
                                begin
                                        inc(nr);
                                        e1:=l[v[i].x];
                                        e2:=l[v[i].y];
                                        vu[nr]:=v[i];
                                        for j:=1 to n do
                                                if l[j]=e2 then
                                                        l[j]:=e1;
                                end;
                        inc(i);
                end;

end;




function max1(x,y:longint):longint;
begin
        if x>y then max1:=x else max1:=y;
end;


{function maxim(x,y:longint):longint;
var viz:array[1..10000] of byte;
        p,u,i,k,max:longint;
        c:array[1..10000] of longint;
begin
        p:=1;
        u:=1;
        c[p]:=x;
        fillchar(viz,sizeof(viz),0);
        viz[x]:=1;
        max:=0;
        repeat
                        k:=c[p];
                        for i:=1 to n-1 do
                                if vu[i].x=k then
                                        begin
                                                if viz[vu[i].y]=0 then
                                                        begin
                                                                inc(u);
                                                                c[u]:=vu[i].y;
                                                                viz[vu[i].y]:=1;
                                                                if vu[i].c>max then
                                                                        max:=vu[i].c;
                                                                if vu[i].y=y then
                                                                        begin
                                                                                maxim:=max;
                                                                                exit;
                                                                        end;
                                                        end;
                                        end else
                                        if vu[i].y=k then
                                                begin
                                                        if viz[vu[i].x]=0 then
                                                                begin
                                                                        inc(u);
                                                                        c[u]:=vu[i].x;
                                                                        viz[vu[i].x]:=1;
                                                                        if vu[i].c>max then
                                                                                max:=vu[i].c;
                                                                        if vu[i].x=y then
                                                                                begin
                                                                                        maxim:=max;
                                                                                        exit;
                                                                                end;
                                                                end;
                                                end;
                        inc(p);
        until p>u;

end; }
procedure df(vf,max:longint);
var i:longint;
begin
        viz[vf]:=1;
        if vf=y then
                begin
                        maxim:=max;
                end else
                for i:=1 to n-1 do
                        if vu[i].x=vf then
                                begin
                                        if viz[vu[i].y]=0 then
                                        df(vu[i].y,max1(max,vu[i].c));
                                end else
                                if vu[i].y=vf then
                                        begin
                                                if viz[vu[i].x]=0 then
                                                df(vu[i].x,max1(max,vu[i].c));
                                        end;
end;


procedure prel;
var i:longint;
begin
        for i:=1 to k do
                begin
                        readln(f,x,y);
                        fillchar(viz,sizeof(viz),0);
                        maxim:=0;
                        df(x,0);
                        writeln(g,maxim);
                end;
        close(f);
        close(g);
end;


begin
        iofile;
        kruskal;
        prel;
end.