1391. 【2012.02.25普及组】危险系数 (Standard IO) 时间限制: 1000 ms 空间限制: 131072 KB 具体限制 Goto ProblemSet 题目描述 FJ在一条船上,海上有N(1<=N<=100)岛,编号为1..N,现在他的任务是按照一个给定访问次序A_1,A_2,….A_M去探索这M(2<=M<=10,000)个岛屿,已经知道任意两个岛屿之间的危险系数,让你找出一个探索序列,只需满足你的探索序列包含给定的A_1..A_M这个序列就可以(不一定要连续),使得总的危险系数最小。 输入 第1行: 两个数, N 和 M 第 2..M+1行: 第i+1行表示给定的序列中第i个岛屿A_i 第M+2..N+M+1行:每行N个整数,表示岛屿之间的危险系数,对角线上一定是0。 输出 输出满足要求的最小危险系数 样例输入 3 4 1 2 1 3 0 5 1 5 0 2 1 2 0 样例输出 7 代码如下: Floyd算法(求最短路) const maxn=100; var a:array[0..maxn,0..maxn] of longint; b:array[0..maxn*maxn] of longint; i,j,k,ans,n,m:longint; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; begin readln(n,m); for i:=1 to m do readln(b[i]); for i:=1 to n do begin for j:=1 to n do read(a[i,j]); readln; end; for i:=1 to n do for j:=1 to n do for k:=1 to n do a[j,k]:=min(a[j,k],a[j,i]+a[i,k]); for i:=2 to m do ans:=ans+a[b[i-1],b[i]]; writeln(ans); end.