Cod sursa(job #6999)

Utilizator valkyriaValkyria Dark valkyria Data 21 ianuarie 2007 11:35:52
Problema Radiatie Scor 0
Compilator fpc Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.71 kb
Program radiatie;

type adresa=^nod; nod=record inf:integer; lung:longint; passed:boolean; adr:adresa; end;

var  l:array[1..30000] of adresa;
	f,g:text;
	i,j,n,nc,m,k,a,b,dest,caut, maxmin:integer;
	c:longint;
	st:array[1..30000] of integer;
	s:array[1..30000]of 0..1;


Procedure ad_nod(x,y:integer;lng:longint);
var a:adresa;
begin
	new(a);
	a^.adr:=l[x]; a^.inf:=y; a^.lung:=lng;
	l[x]:=a;
	new(a);
	a^.adr:=l[y]; a^.inf:=x; a^.lung:=lng;
	l[y]:=a;
end;

function lungime(a,b:integer):longint;
var aD:adresa;
begin
	aD:=L[A];
	while ad<>nil do begin
		if ad^.inf=b then 
	begin lungime:=ad^.lung; break; end
		else ad:=ad^.adr;
	end;
end;

function maxim(nr:integer):longint;
var i:integer; max,lth:longint;
begin
	max:=0; 
	for i:=1 to nr-1 do begin
		lth:=lungime(st[i],st[i+1]);
		if lth>max then max:=lth;
	end;
maxim:=max;
end;

Procedure initpassed;
var a:adresa;q:integer;
begin
	for q:=1 to n do
		begin
			a:=l[q];
			while a<>nil do begin
				a^.passed:=true;
				a:=a^.adr;
			end;
		end;
end;


Procedure df(p:integer);
var a:adresa; lth:longint;
begin
	s[p]:=1;
	nc:=nc+1;
	st[nc]:=p;
	if p=caut then begin  lth:=maxim(nc); if lth<maxmin then maxmin:=lth; end
	else begin
	a:=l[p];
	while a<>nil do begin
		if (s[a^.inf]=0) and a^.passed then
			begin
			a^.passed:=false;
			df(a^.inf);
			end;
		a:=a^.adr;
	end;
	end;
	nc:=nc-1;
	s[p]:=0;
end;

begin
	assign(f,'radiatie.in'); reset(f);
	assign(g,'radiatie.out'); rewrite(g);
	readln(f,n,m,k);
	for i:=1 to n do l[i]:=nil;
	for i:=1 to m do begin
		readln(f,a,b,c);
		ad_nod(a,b,c);
		end;
	for i:=1 to k do begin
		readln(f,dest,caut);
		initpassed;
		maxmin:=9999;
		for j:=1 to k do begin st[i]:=0; s[i]:=0; end;
		df(dest);
		writeln(g,maxmin);
	end;

	close(f);
	close(g);
end.