[TYVJ 1288] 飘飘乎居士取能量块

来源:互联网 发布:升腾资讯java笔试 编辑:程序博客网 时间:2024/06/02 21:20

传送门

http://tyvj.cn/p/1288

题目大意

给定n个点间距离,以及必须走的点,询问1到n的最短路

题解

由于必须要走的点最多只有10个,全排列只有10!=3628800个
Floyd处理后,枚举这些方案比较即可
注意啊,p个点是一行的…

var w:array[0..200,0..200]of longint; z,y,x:array[0..20]of longint; i,j,k:longint; n,p,ans:longint;function min(a,b:longint):longint;begin if a>b then exit(b) else exit(a);end;procedure check;var i,a:longint;begin a:=0; for i:=1 to p-1 do  inc(a,w[z[i],z[i+1]]); inc(a,w[1,z[1]]+w[z[p],n]); if a<ans then ans:=a;end;procedure dfs(a:longint);var i:longint;begin if a=p then begin check; exit; end; for i:=1 to p do  if y[i]=0  then begin y[i]:=1; z[a+1]:=x[i]; dfs(a+1); y[i]:=0; end;end;begin readln(n); for i:=1 to n do  begin   for j:=1 to n do    read(w[i,j]);   readln;  end; for k:=1 to n do  for i:=1 to n do   for j:=1 to n do    w[i,j]:=min(w[i,j],w[i,k]+w[k,j]); readln(p); for i:=1 to p do  read(x[i]); ans:=maxlongint; dfs(0); if  p=0 then ans:=w[1,n]; writeln(ans);end.
0 0