Description
某乡有n个村庄(1< n< 40),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0< s< 1000)是已知的,且A村到B村与B村到A
村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么
样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
Input
村庄数n和各村之间的路程(均是整数)。
Output
最短的路程。
Sample Input
3 {村庄数}
0 2 1 {村庄1到各村的路程}
1 0 2 {村庄2到各村的路程}
2 1 0 {村庄3到各村的路程}
Sample Output
3
Source
搜索
限时2000MS
请问我为什么老是超时,请高手帮忙修改(请注意是修改,不是答案!!)
var sz:array [1..40,1..40] of longint;
flag:array [1..40] of longint;
n,i,j,min,m:longint;
procedure work(c,i:longint);
var j:longint;
begin
if c=n
then begin if m+sz[i,1]<min then min:=m+sz[i,1]; end
else
begin
{for j:=2 to n do
if (flag[j]=0) and ((m+sz[i,j])<=min)
then
begin
flag[j]:=1;
m:=m+sz[i,j];
work(c+1,j);
flag[j]:=0;
m:=m-sz[i,j];
end;}
for j:=2 to n do
if (i<>j) and (flag[j]=0) then
begin
m:=m+sz[i,j];
flag[j]:=1;
if m<min then work(c+1,j);
m:=m-sz[i,j];
flag[j]:=0;
end;
end;
end;
begin
assign(input,'saleman.in');
assign(output,'saleman.out');
reset(input);
rewrite(output);
readln(n);
for i:=1 to n do
begin
for j:=1 to n do read(sz[i,j]);
readln;
end;
min:=999999;
for i:=2 to n do
begin
flag[i]:=1;
m:=sz[1,i];
work(2,i);
flag[i]:=0;
end;
writeln(min);
close(input);
close(output);
end.