讨论 / 为什么用回溯第3个点过不了
dsqx71 2010-05-22 05:44:00
点我顶贴 收藏 删除
var v:array[0..251,0..251]of boolean;

a,g:array[0..251,0..251]of longint;

w,s:array[0..251]of boolean;

f:array[0..251]of longint;

n,m,i,min:longint;

procedure init;

var x,y,t,i:longint;

begin

readln(n,m);

fillchar(v,sizeof(v),#0);

fillchar(w,sizeof(w),#0);

fillchar(s,sizeof(s),#0);

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

fillchar(g,sizeof(g),0);

fillchar(f,sizeof(f),0);

for i:=1 to m do

begin

readln(x,y,t);

v[x,y]:=true;

v[y,x]:=true;

a[x,y]:=t;

a[y,x]:=t;

inc(g[x,0]);

g[x,g[x,0]]:=y;

inc(g[y,0]);

g[y,g[y,0]]:=x;

if(x=y)then min:=t;

end;

end;

{--------------------------}

procedure dfs(x,tot:longint);

var i:longint;

begin

if(tot<min)then

begin

if(w[x]=true)and(f[x]<>0)then

begin

s[x]:=true;

if min>tot-f[x]then min:=tot-f[x];

end

else

begin

f[x]:=tot;

begin

for i:=1 to g[x,0] do

if(v[x,g[x,i]]=true)and(tot+a[x,g[x,i]]<min)then

begin

w[g[x,i]]:=true;

v[x,g[x,i]]:=false;

v[g[x,i],x]:=false;

dfs(g[x,i],tot+a[x,g[x,i]]);

w[g[x,i]]:=false;

v[x,g[x,i]]:=true;

v[g[x,i],x]:=true;

end;

end;

f[x]:=0;

end;

end;

end;

{--------------------------}

BEGIN

init;

min:=maxlongint;

for i:=1 to n do

if(s[i]=false)then

begin

w[i]:=true;

dfs(i,0);

w[i]:=false;

end;

if min=maxlongint then

writeln('He will never come back.')

else writeln(min);

END.

貌似数据奇弱,优化和没优化基本没有区别,第10个点还比正解快了100MS

但是第三个点怎么也过不了。。

查看更多回复
提交回复