#pragma region /* \(^o^)/ import sys 私は人間です. 吾輩はやれば出来る子である.     ∩ ∩    (´・ω・)    _| ⊃/(___  / └-(____/   ̄ ̄ ̄ ̄ ̄ ̄ ̄  やる気はまだない.    ⊂⌒/ヽ-、__  /⊂_/____ /   ̄ ̄ ̄ ̄ ̄ ̄ ̄ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; struct Init{Init(){std::cin.tie(0); ios::sync_with_stdio(false); cout << setprecision(20) << fixed;}}init; using ll = long long; using ull = unsigned long long; using ld = long double; #define all(x) begin((x)), end((x)) #define pb push_back #define mp make_pair #define mt make_tuple #define uq(v) v.erase(unique(begin(v), end(v)), end(v)) #define _overload4(_1,_2,_3,_4,name,...) name #define _overload3(_1,_2,_3,name,...) name #define _rep1(n) for(int i=0;i=0;i--) #define _rrep2(i,n) for(int i=(n)-1;i>=0;i--) #define _rrep3(i,a,b) for(int i=(b)-1;i>=(a);i--) #define _rrep4(i,a,b,c) for(int i=a+(b-a-1)/c*c;i>=a;i-=c) #define rrep(...) _overload4(__VA_ARGS__,_rrep4,_rrep3,_rrep2,_rrep1)(__VA_ARGS__) template using pq = priority_queue; template using pq_g = priority_queue, greater>; template bool chmax(T &a, const T &b){if(a < b){a = b; return 1; } return 0;} template bool chmin(T &a, const T &b){if(a > b){a = b; return 1; } return 0;} template auto min(const T& a){ return *min_element(all(a)); } template auto max(const T& a){ return *max_element(all(a)); } constexpr ull INF = (1ULL << 61) + (1ULL << 30); constexpr int inf = (1 << 30); constexpr int dx[] = {1, 0, -1, 0, 1, 1, -1, -1}; constexpr int dy[] = {0, 1 ,0, -1, 1, -1, 1, -1}; #pragma endregion int main(){ int N, M, K; cin >> N >> M >> K; vector dist1(N, inf); pq_g> q1; rep(i, K){ int A; cin >> A; --A; dist1[A] = 0; q1.push(mp(0, A)); } vector> T(N, vector(N)); rep(i, N) rep(j, N) cin >> T[i][j]; while(!q1.empty()){ auto [d, v] = q1.top(); q1.pop(); if(dist1[v] < d) continue; rep(i, N){ if(i == v) continue; if(chmin(dist1[i], d + T[v][i])){ q1.push(mp(dist1[i], i)); } } } set root; int ans = inf; int sum = 0; auto dfs = [&](auto self, int cur, int cnt) -> void { if(cnt == M){ chmin(ans, sum + dist1[cur]); return; } rep(i, N){ if(root.contains(i)) continue; sum += T[cur][i]; root.insert(i); self(self, i, cnt + 1); sum -= T[cur][i]; root.erase(i); } }; rep(i, N){ root.insert(i); dfs(dfs, i, 1); root.erase(i); } cout << ans << "\n"; }