library

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

View the Project on GitHub firiexp/library

:heavy_check_mark: graph/independentset.cpp

Verified with

Code

class IndependentSet {
    int n;
    vector<ull> G;
    pair<int, ull> dfs(ull R, ull P, ull X){
        if(!P && !X){
            return {__builtin_popcountll(R), R};
        }
        if(!P) return {-1, 0};
        pair<int, ull> res = {-1, 0};
        int pivot = __builtin_ctzll(P|X);
        ull z = P & ~G[pivot];
        for (int i = 0; i < n; ++i) {
            if(z & (1ull << i)){
                res = max(res, dfs(R|(1ull << i), P&G[i], X&G[i]));
                P ^= 1ull << i;
                X |= 1ull << i;
            }
        }
        return res;
    }


public:
    explicit IndependentSet(int n): n(n), G(n) {
        for (int i = 0; i < n; ++i) {
            G[i] = ((1ull << n)-1)^(1ull << i);
        }
    }
    void add_edge(int u, int v){
        G[u] &= ~(1ull << v);
        G[v] &= ~(1ull << u);
    }
    pair<int, ull> maximum_independent_set() {
        return dfs(0, (1ull << n)-1, 0);
    }
};
#line 1 "graph/independentset.cpp"
class IndependentSet {
    int n;
    vector<ull> G;
    pair<int, ull> dfs(ull R, ull P, ull X){
        if(!P && !X){
            return {__builtin_popcountll(R), R};
        }
        if(!P) return {-1, 0};
        pair<int, ull> res = {-1, 0};
        int pivot = __builtin_ctzll(P|X);
        ull z = P & ~G[pivot];
        for (int i = 0; i < n; ++i) {
            if(z & (1ull << i)){
                res = max(res, dfs(R|(1ull << i), P&G[i], X&G[i]));
                P ^= 1ull << i;
                X |= 1ull << i;
            }
        }
        return res;
    }


public:
    explicit IndependentSet(int n): n(n), G(n) {
        for (int i = 0; i < n; ++i) {
            G[i] = ((1ull << n)-1)^(1ull << i);
        }
    }
    void add_edge(int u, int v){
        G[u] &= ~(1ull << v);
        G[v] &= ~(1ull << u);
    }
    pair<int, ull> maximum_independent_set() {
        return dfs(0, (1ull << n)-1, 0);
    }
};
Back to top page