CP-templates

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Misuki743/CP-templates

:heavy_check_mark: graph/MIS.cpp

Verified with

Code

vector<int> MIS(vector<ull> g, int n) {
  vector<unsigned> pre(1 << (n / 2));
  for(unsigned msk = 0; msk < (1 << (n / 2)); msk++) {
    int adj = 0;
    for(int v = 0; v < n / 2; v++)
      if (msk >> v & 1)
        adj |= g[v];
    if (!(adj & msk))
      pre[msk] = msk;
  }
  for(int i = 0; (1 << i) < ssize(pre); i++)
    for(int j = 0; j < ssize(pre); j++)
      if ((j >> i & 1) and popcount(pre[j ^ (1 << i)]) > popcount(pre[j]))
        pre[j] = pre[j ^ (1 << i)];

  ull best = 0;
  auto dfs = [&](int v, ull is, ull adj, auto self) -> void {
    if (v == n / 2 - 1) {
      is |= pre[~adj & ((1LL << (n / 2)) - 1)];
      if (popcount(is) > popcount(best))
        best = is;
    } else  {
      self(v - 1, is, adj, self);
      adj |= g[v];
      if (~adj >> v & 1)
        self(v - 1, is | (1LL << v), adj, self);
    }
  };

  dfs(n - 1, 0, 0, dfs);

  vector<int> mis;
  for(int v = 0; v < n; v++)
    if (best >> v & 1)
      mis.emplace_back(v);

  return mis;
}
#line 1 "graph/MIS.cpp"
vector<int> MIS(vector<ull> g, int n) {
  vector<unsigned> pre(1 << (n / 2));
  for(unsigned msk = 0; msk < (1 << (n / 2)); msk++) {
    int adj = 0;
    for(int v = 0; v < n / 2; v++)
      if (msk >> v & 1)
        adj |= g[v];
    if (!(adj & msk))
      pre[msk] = msk;
  }
  for(int i = 0; (1 << i) < ssize(pre); i++)
    for(int j = 0; j < ssize(pre); j++)
      if ((j >> i & 1) and popcount(pre[j ^ (1 << i)]) > popcount(pre[j]))
        pre[j] = pre[j ^ (1 << i)];

  ull best = 0;
  auto dfs = [&](int v, ull is, ull adj, auto self) -> void {
    if (v == n / 2 - 1) {
      is |= pre[~adj & ((1LL << (n / 2)) - 1)];
      if (popcount(is) > popcount(best))
        best = is;
    } else  {
      self(v - 1, is, adj, self);
      adj |= g[v];
      if (~adj >> v & 1)
        self(v - 1, is | (1LL << v), adj, self);
    }
  };

  dfs(n - 1, 0, 0, dfs);

  vector<int> mis;
  for(int v = 0; v < n; v++)
    if (best >> v & 1)
      mis.emplace_back(v);

  return mis;
}
Back to top page