Submission #223837

#TimeUsernameProblemLanguageResultExecution timeMemory
223837jk_Political Development (BOI17_politicaldevelopment)C++14
100 / 100
193 ms9960 KiB
#include <bits/stdc++.h>  // score: 100
using namespace std;

int clique_n;
array<bitset<10>, 10> adjmat;
uint32_t mask;
uint32_t popcount;
int largest_clique(int i) {
  if (i == clique_n)
    return popcount;
  int best = largest_clique(i+1);  // skip i

  if ((adjmat[i].to_ulong() & mask) == mask) {
    mask ^= 1 << i;
    ++popcount;
    best = max(best, largest_clique(i)); // take i
    --popcount;
    mask ^= 1 << i;
  }
  return best;
}

signed main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);

  int n, k; cin >> n >> k;
  vector<vector<int>> g(n);
  vector<int> degree(n);
  for (int i = 0; i < n; ++i) {
    cin >> degree[i];
    for (int j = 0; j < degree[i]; ++j) {
      int b; cin >> b;
      g[i].push_back(b);
    }
  }
  vector<bool> removed(n);
  priority_queue<pair<size_t, int>,
		 vector<pair<size_t, int>>,
		 greater<>> pq;
  for (int i = 0; i < n; ++i)
    pq.emplace(degree[i], i);
  for (auto& v : g)
    sort(v.begin(), v.end());
  
  auto has_edge = [&](int a, int b) { return binary_search(g[a].begin(), g[a].end(), b); };
  int best = 1;
  
  while (!pq.empty()) {
    auto [_, i] = pq.top();
    pq.pop();
    if (removed[i])
      continue;
    removed[i] = true;
    vector<int> nbs = g[i];
    nbs.erase(remove_if(nbs.begin(), nbs.end(), [&](int v){ return removed[v]; }), nbs.end());
    
    adjmat = {};
    mask = 0;
    popcount = 0;
    clique_n = nbs.size();
    for (size_t i = 0; i < nbs.size(); ++i) {
      for (size_t j = 0; j < nbs.size(); ++j) {
	if (i != j)
	  adjmat[i][j] = has_edge(nbs[i], nbs[j]);
      }
    }
    best = max(best, 1+largest_clique(0));   // 1+ because we always take i itself
    for (auto j : nbs) {
      --degree[j];
      pq.emplace(degree[j], j);
    }
  }
  cout << best << '\n';
}

Compilation message (stderr)

politicaldevelopment.cpp: In function 'int main()':
politicaldevelopment.cpp:50:10: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     auto [_, i] = pq.top();
          ^
politicaldevelopment.cpp:50:15: warning: unused variable '_' [-Wunused-variable]
     auto [_, i] = pq.top();
               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...