永发信息网

售货员的难题 free pascal

答案:1  悬赏:0  手机版
解决时间 2021-08-14 07:45
  • 提问者网友:温柔港
  • 2021-08-13 23:48

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.

最佳答案
  • 五星知识达人网友:孤独入客枕
  • 2021-08-14 00:30
不输出那块改成函数然后调用应该会不超了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯