讨论 / 为什么第七个点错了
x50946702 2010-07-24 03:00:00
点我顶贴 收藏 删除
最朴素的folyd+枚举

program core;

var

a,d:array[1..301,1..301]of longint;

lis:array[1..301]of longint;

hash:array[1..301]of boolean;

t,n,s,dfs,l,r,ecc:longint;

function min(a,b:longint):longint;

begin

if a>b then exit(b)

else exit(a);

end;

procedure init;

var

i,x,y,j,z,p:longint;

begin

fillchar(a,sizeof(a),0);

fillchar(hash,sizeof(hash),true);

readln(n,s);

for i:=1 to n do

for j:=1 to n do

d[i,j]:=99999;

for i:=1 to n-1 do

begin

readln(x,y,z);

a[x,y]:=z; d[x,y]:=z;

a[y,x]:=z; d[y,x]:=z;

end;

ecc:=maxlongint; t:=1;

for i:=1 to n do

d[i,i]:=0;

end;

procedure floyd;

var

i,j,k,max:longint;

begin

max:=0;

for k:=1 to n do

for i:=1 to n do

for j:=1 to n do

if d[i,k]+d[k,j]<d[i,j] then d[i,j]:=d[i,k]+d[k,j];

for i:=1 to n do

for j:=1 to n do

if (d[i,j]>max)and(d[i,j]<>99999) then begin max:=d[i,j]; l:=i; r:=j; end;

end;

procedure dfss(k:longint);

var

i,j:longint;

begin

if k=r then begin inc(t); lis[t]:=r; exit; end

else begin

for i:=1 to n do

begin

if lis[t]=r then exit;

if (a[k,i]<>0)and(hash[i]) then begin

inc(t); lis[t]:=i; hash[i]:=false; dfss(i);

if lis[t]=r then exit;

dec(t); hash[i]:=true;

end;

end;

end;

end;

procedure search;

var

i,j,k,mm:longint;

begin

for i:=1 to t do

begin

for j:=i to t do

begin

mm:=-maxlongint;

if d[lis[i],lis[j]]<=s then begin

for k:=1 to n do

if min(d[lis[i],k],d[lis[j],k])>mm then mm:=min(d[lis[i],k],d[lis[j],k]);

if mm<ecc then ecc:=mm;

end;

end;

end;

end;

begin

init;

floyd;

lis[1]:=l; hash[l]:=false;

dfss(l);

dec(t);

search;

writeln(ecc);

end.

#1 zjxixihaha@2010-07-24 03:00:00
回复 删除
我的还是错的
查看更多回复
提交回复