图论 - 最短路 - Floyd
题目链接: https://www.luogu.org/problem/P2910
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int M = 10010;
int n, m;
int dis[N][N], ord[M];
void Floyd() {
for (int k = 1; k <= n; k ++ ) {
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
if (dis[i][j] > dis[i][k] + dis[k][j]) {
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i ++ ) {
scanf("%d", &ord[i]);
}
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
scanf("%d", &dis[i][j]);
}
}
Floyd();
int ans = 0;
for (int i = 1; i < m; i ++ ) {
ans += dis[ord[i]][ord[i + 1]];
}
printf("%d
", ans);
return 0;
}