题解:乍一看这个要求的路径还得经过如下的点,然后取最短路径,吓我一跳——直到我看到了必须依次经过以下点。。。这样一来就没啥了,先是Floyd一遍弄出各个点之间的最短路径,然后既然要求必须按序经过且不一定相邻,则直接累加各个段的最短路就Accept啦*^_^*。。。(PS:Floyd时不要排除a[i,k]或者a[k,j]为零的状况,因为在这个题目中不存在不直接相连的点,就算真的出现0,代表的也是真正意义上的两点距离为零,我虽然没有因此跪过但还是觉得最好留心点。。。)
1 var
2 i,j,k,m,n:longint;
3 l:int64;
4 a:array[0..200,0..200] of int64;
5 b:array[0..20000] of longint;
6 begin
7 readln(n,m);
8 for i:=1 to m do
9 readln(b[i]);
10 b[0]:=1;
11 b[m+1]:=n;
12 for i:=1 to n do
13 begin
14 for j:=1 to n do
15 read(a[i,j]);
16 readln;
17 end;
18 for k:=1 to n do
19 for i:=1 to n do
20 begin
21 if (i=k) then continue;
22 for j:=1 to n do
23 begin
24 if (i=j) or (k=j) then continue;
25 if (a[i,k]+a[k,j])<a[i,j] then a[i,j]:=a[i,k]+a[k,j];
26 end;
27 end;
28 for i:=0 to m do
29 l:=l+a[b[i],b[i+1]];
30 writeln(l);
31 end.
32