题目意思解释一下:那个序列就是求相邻两个节点的最短路之和。
然后跑多源最短路(Floyd)就OK了。
\(Code:\)
#pragma GCC diagnostic error "-std=c++11"
#include <iostream>
#include <cstdio>
#define inf 99999999
using namespace std;
template<class T>void r(T &a)//快读
{
T s=0,w=1;a=0;char ch=getc(stdin);
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getc(stdin);}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getc(stdin);}
a=w*s;
}
template<class T,class... Y>void r(T& t,Y&... a){r(t);r(a...);}
int dis[110][110],arr[10010];
int main()
{
int n,m,ans=0;
r(n,m);
for(int i=1;i<=m;i++)
r(arr[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
r(dis[i][j]);
for(int k=1;k<=n;k++)//Floyd
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
for(int i=2;i<=m;i++)//求答案
ans+=dis[arr[i-1]][arr[i]];
printf("%d\n",ans);
return 0;
}