Submission #1174778

#TimeUsernameProblemLanguageResultExecution timeMemory
1174778nuutsnoyntonKronican (COCI16_kronican)C++20
10 / 100
64 ms328 KiB
#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 timeMemoryGrader output
Fetching results...