開啟章節選單

13211 Geonosis

程式碼

#include <bits/stdc++.h>
using namespace std;
#define int long long

void solve() {
    int n, g[505][505], ans = 0;
    cin >> n;
    vector<int> order(n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> g[i][j];
        }
    }
    for (int i = n - 1; i >= 0; i--) cin >> order[i];

    for (int i = 0; i < n; i++) {
        int it = order[i];
        for (int a = 0; a < n; a++) {
            for (int b = 0; b < n; b++) {
                g[a][b] = min(g[a][b], g[a][it] + g[it][b]);
            }
        }
        for (int a = 0; a < i + 1; a++) {
            for (int b = 0; b < i + 1; b++) {
                if (a != b) ans += g[order[a]][order[b]];
            }
        }
    }
    cout << ans << '\n';
}

signed main() {
    int t;
    cin >> t;
    while (t--) solve();
}