#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair < ll, ll >;
ll D[22][22] = {0}, d[22], ataman[22];
ll Get(ll x) {
if (x == ataman[x]) return x;
return ataman[x] = Get(ataman[x]);
}
int main() {
ll n, m, r, x, s,node, y, k, i,sum, j, ans, t;
cin >> n >> k;
vector < pair < ll , pair < ll, ll > > > q;
for (i = 1; i <= n; i ++) {
for (j = 1; j <= n; j ++) {
cin >> D[i][j];
q.push_back(make_pair(D[i][j], make_pair(i, j)));
}
}
sort(q.begin(), q.end());
vector <ll > v;
for (i = 1; i <= k; i ++) {
v.push_back(i);
}
ans = 1e17;
while(1) {
for (i = 1; i <= n; i ++) ataman[i] = i;
sum = 0;
for (i = 0; i < v.size(); i ++) {
ataman[v[i]] = v[0];
}
for (i = 0; i < q.size(); i ++) {
x = q[i].second.first;
y = q[i].second.second;
if ( Get(x) != Get(y)) {
ataman[Get(x)] = Get(y);
sum += q[i].first;
}
}
ans = min(ans, sum);
r = v.size();
ll p = n;
//cout << r << endl;
while (r > 0 && v[r - 1] == p) {
r --;
p --;
}
if ( r == 0) break;
v[r - 1] ++;
while ( r <v.size()) {
v[r] = v[r - 1] + 1;
r ++;
}
}
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |