售货员的难题
源程序名 salesman.???(pas, c, cpp) 可执行文件名 salesman.exe 输入文件名 salesman.in 输出文件名 salesman.out |
【问题描述】
某乡有n个村庄(1<n<=14),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
【输入】
村庄数n和各村之间的路程(均是整数)。
【输出】
最短的路程。
【样例】
salesman.in salesman.out
3 {村庄数} 3
0 2 1 {村庄1到各村的路程}
1 0 2 {村庄2到各村的路程}
2 1 0 {村庄3到各村的路程}
=======================
搜索
优化
1.可行性
2.最优化
-------------
一个注意
maxlongint=2^31-1
=======================
var
n,ans:longint;
map:array[1..14,1..14]of longint;
f:array[1..14]of boolean;
procedure init;
begin
assign(input,'salesman.in');
assign(output,'salesman.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure dfs(t,x,tot:longint);
var
i:longint;
begin
if t=n then
begin
if tot+map[x,1]<ans then ans:=tot+map[x,1];
exit;
end;
for i:=2 to n do
if f[i] then
begin
if tot+map[x,i]<ans then
begin
f[i]:=false;
dfs(t+1,i,tot+map[x,i]);
f[i]:=true;
end;
end;
end;
procedure main;
var
i,j:longint;
begin
readln(n);
fillchar(f,sizeof(f),true);
for i:=1 to n do
for j:=1 to n do
read(map[i,j]);
//for i:=1 to n do
//begin
//for j:=1 to n do
//write(map[i,j],' ');
//writeln;
//end;
ans:=maxlongint;
dfs(1,1,0);
writeln(ans);
end;
begin
init;
main;
terminate;
end.