제출 #88454

#제출 시각아이디문제언어결과실행 시간메모리
88454xiaowuc1Kronican (COCI16_kronican)C++14
30 / 100
848 ms668 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> edge;

int dp[20][20];
bool seen[20];

void solve() {
  int n, k;
  cin >> n >> k;
  for(int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++) {
      cin >> dp[i][j];
    }
  }
  int ret = 1 << 30;
  for(int mask = (1<<k)-1; mask < (1<<n); mask++) {
    if(__builtin_popcount(mask) != k) continue;
    int need = n;
    priority_queue<edge> q;
    memset(seen, 0, sizeof(seen));
    {
      int t = mask;
      while(t) {
        int curr = __builtin_ctz(t);
        t &= t-1;
        seen[curr] = true;
        need--;
        for(int i = 0; i < n; i++) {
          q.push({-dp[i][curr], i});
        }
      }
    }
    int now = 0;
    while(need && now < ret) {
      edge curr = q.top();
      q.pop();
      if(seen[curr.second]) continue;
      seen[curr.second] = true;
      now -= curr.first;
      need--;
      for(int i = 0; i < n; i++) {
        q.push({-dp[i][curr.second], i});
      }
    }
    ret = min(ret, now);
  }
  cout << ret << endl;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...