This documentation is automatically generated by competitive-verifier/competitive-verifier
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/maximum_independent_set
// clang-format on
#include <iostream>
#include "../../graph/others/maximum-independent-set.hpp"
#include "../../math/matrix/matrix.hpp"
using namespace std;
int main() {
int N, M;
cin >> N >> M;
Matrix<bool> mat(N);
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
mat[a][b] = true;
mat[b][a] = true;
}
auto ret = maximum_independent_set(mat);
cout << ret.size() << endl;
for (int i = 0; i < static_cast<int>(ret.size()); i++) {
if (i > 0) cout << " ";
cout << ret[i];
}
cout << endl;
}
#line 1 "test/verify/yosupo-maximum-independent-set.test.cpp"
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/maximum_independent_set
// clang-format on
#include <iostream>
#line 2 "graph/others/maximum-independent-set.hpp"
#include <algorithm>
#include <cassert>
#include <chrono>
#include <cstdint>
#include <iterator>
#include <numeric>
#include <random>
#include <vector>
/**
* @brief Maximum Independent Set(最大独立集合)
*/
template <typename Matrix>
std::vector<int> maximum_independent_set(const Matrix& g, int trial = 1000000) {
int N = (int)g.size();
std::vector<std::uint64_t> bit(N);
assert(N <= 64);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i != j) {
assert(g[i][j] == g[j][i]);
if (g[i][j]) bit[i] |= std::uint64_t(1) << j;
}
}
}
std::vector<int> ord(N);
std::iota(std::begin(ord), std::end(ord), 0);
std::mt19937 mt(std::chrono::steady_clock::now().time_since_epoch().count());
int ret = 0;
std::uint64_t ver = 0;
for (int i = 0; i < trial; i++) {
std::shuffle(std::begin(ord), std::end(ord), mt);
std::uint64_t used = 0;
int add = 0;
for (int j : ord) {
if (used & bit[j]) continue;
used |= std::uint64_t(1) << j;
++add;
}
if (ret < add) {
ret = add;
ver = used;
}
}
std::vector<int> ans;
for (int i = 0; i < N; i++) {
if ((ver >> i) & 1) ans.emplace_back(i);
}
return ans;
}
#line 2 "math/matrix/matrix.hpp"
#line 4 "math/matrix/matrix.hpp"
#include <cstddef>
#line 7 "math/matrix/matrix.hpp"
template <class T>
struct Matrix {
std::vector<std::vector<T> > A;
Matrix() {}
Matrix(const std::vector<std::vector<T> >& A) : A(A) {}
Matrix(std::size_t n, std::size_t m) : A(n, std::vector<T>(m, 0)) {}
Matrix(std::size_t n) : A(n, std::vector<T>(n, 0)) {};
std::size_t size() const {
if (A.empty()) return 0;
assert(A.size() == A[0].size());
return A.size();
}
std::size_t height() const { return (A.size()); }
std::size_t width() const { return (A[0].size()); }
inline const std::vector<T>& operator[](int k) const { return (A.at(k)); }
inline std::vector<T>& operator[](int k) { return (A.at(k)); }
static Matrix I(std::size_t n) {
Matrix mat(n);
for (int i = 0; i < n; i++) mat[i][i] = 1;
return (mat);
}
Matrix& operator+=(const Matrix& B) {
std::size_t n = height(), m = width();
assert(n == B.height() && m == B.width());
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) (*this)[i][j] += B[i][j];
return (*this);
}
Matrix& operator-=(const Matrix& B) {
std::size_t n = height(), m = width();
assert(n == B.height() && m == B.width());
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) (*this)[i][j] -= B[i][j];
return (*this);
}
Matrix& operator*=(const Matrix& B) {
std::size_t n = height(), m = B.width(), p = width();
assert(p == B.height());
std::vector<std::vector<T> > C(n, std::vector<T>(m, 0));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
for (int k = 0; k < p; k++)
C[i][j] = (C[i][j] + (*this)[i][k] * B[k][j]);
A.swap(C);
return (*this);
}
Matrix& operator^=(long long k) {
Matrix B = Matrix::I(height());
while (k > 0) {
if (k & 1) B *= *this;
*this *= *this;
k >>= 1LL;
}
A.swap(B.A);
return (*this);
}
Matrix operator+(const Matrix& B) const { return (Matrix(*this) += B); }
Matrix operator-(const Matrix& B) const { return (Matrix(*this) -= B); }
Matrix operator*(const Matrix& B) const { return (Matrix(*this) *= B); }
Matrix operator^(const long long k) const { return (Matrix(*this) ^= k); }
friend std::ostream& operator<<(std::ostream& os, Matrix& p) {
std::size_t n = p.height(), m = p.width();
for (int i = 0; i < n; i++) {
os << "[";
for (int j = 0; j < m; j++) {
os << p[i][j] << (j + 1 == m ? "]\n" : ",");
}
}
return (os);
}
T determinant() {
Matrix B(*this);
assert(width() == height());
T ret = 1;
for (int i = 0; i < width(); i++) {
int idx = -1;
for (int j = i; j < width(); j++) {
if (B[j][i] != 0) idx = j;
}
if (idx == -1) return (0);
if (i != idx) {
ret *= -1;
std::swap(B[i], B[idx]);
}
ret *= B[i][i];
T vv = B[i][i];
for (int j = 0; j < width(); j++) {
B[i][j] /= vv;
}
for (int j = i + 1; j < width(); j++) {
T a = B[j][i];
for (int k = 0; k < width(); k++) {
B[j][k] -= B[i][k] * a;
}
}
}
return (ret);
}
};
#line 9 "test/verify/yosupo-maximum-independent-set.test.cpp"
using namespace std;
int main() {
int N, M;
cin >> N >> M;
Matrix<bool> mat(N);
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
mat[a][b] = true;
mat[b][a] = true;
}
auto ret = maximum_independent_set(mat);
cout << ret.size() << endl;
for (int i = 0; i < static_cast<int>(ret.size()); i++) {
if (i > 0) cout << " ";
cout << ret[i];
}
cout << endl;
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | example_00 |
|
60 ms | 3 MB |
| g++ | example_01 |
|
46 ms | 4 MB |
| g++ | hack0_00 |
|
262 ms | 4 MB |
| g++ | handmade_00 |
|
63 ms | 4 MB |
| g++ | many_maximals_00 |
|
237 ms | 4 MB |
| g++ | max_random_00 |
|
180 ms | 3 MB |
| g++ | max_random_01 |
|
229 ms | 4 MB |
| g++ | max_random_02 |
|
272 ms | 4 MB |
| g++ | max_random_03 |
|
233 ms | 4 MB |
| g++ | max_random_04 |
|
195 ms | 4 MB |
| g++ | one_two_00 |
|
236 ms | 4 MB |
| g++ | random_00 |
|
171 ms | 4 MB |
| g++ | random_01 |
|
44 ms | 4 MB |
| g++ | random_02 |
|
145 ms | 4 MB |
| g++ | random_03 |
|
5 ms | 4 MB |
| g++ | random_04 |
|
144 ms | 4 MB |
| clang++ | example_00 |
|
40 ms | 4 MB |
| clang++ | example_01 |
|
34 ms | 4 MB |
| clang++ | hack0_00 |
|
181 ms | 3 MB |
| clang++ | handmade_00 |
|
49 ms | 4 MB |
| clang++ | many_maximals_00 |
|
181 ms | 4 MB |
| clang++ | max_random_00 |
|
181 ms | 4 MB |
| clang++ | max_random_01 |
|
181 ms | 4 MB |
| clang++ | max_random_02 |
|
183 ms | 4 MB |
| clang++ | max_random_03 |
|
181 ms | 4 MB |
| clang++ | max_random_04 |
|
181 ms | 4 MB |
| clang++ | one_two_00 |
|
181 ms | 4 MB |
| clang++ | random_00 |
|
149 ms | 4 MB |
| clang++ | random_01 |
|
31 ms | 4 MB |
| clang++ | random_02 |
|
114 ms | 4 MB |
| clang++ | random_03 |
|
6 ms | 4 MB |
| clang++ | random_04 |
|
97 ms | 4 MB |