→题目链接←
裸最短路
代码:
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#define inf 90000000
using namespace std;
int n,m;
int a[110][110];
int Min[110][110];
int to[10010];
queue<int>q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++){
scanf("%d",&to[i]);
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
int x;
scanf("%d",&x);
a[i][j]=x;
Min[i][j]=inf;
}
}
for(int i=1; i<=n; i++){
q.push(i);
Min[i][i]=0;
while(!q.empty()){
int t=q.front();
q.pop();
for(int j=1; j<=n; j++){
if(Min[i][j]<=Min[i][t]+a[t][j])continue;
Min[i][j]=Min[i][t]+a[t][j];
q.push(j);
}
}
}
int ans=0;
for(int i=2; i<=m; i++){
ans+=Min[to[i-1]][to[i]];
}
printf("%d\n",ans);
return 0;
}