zoukankan      html  css  js  c++  java
  • 2-sat板子

    namespace TwoSat {
        const int N = 2007;
        int dfn[N << 1], low[N << 1], belong[N << 1], idx;
        int in[N << 1], ou[N << 1], stk[N << 1], top;
        int ans[N], scc_cnt, sign, n;
        vector<int> G[N << 1];
        void init(int _n) {
            n = _n;
            for(int i = 0; i <= n * 2 + 1; i++) {
                belong[i] = dfn[i] = low[i] = 0;
                stk[i] = in[i] = ou[i] = 0;
                G[i].clear();
            }
            scc_cnt = idx = top = sign = 0;
        }
        void addEdge(int u, int v) {
            G[u].push_back(v);
        }
        void tarjan(int u) {
            stk[++top] = u; in[u] = 1;
            dfn[u] = ++idx; low[u] = idx;
            for(auto &v : G[u]) {
                if(dfn[v] == 0) {
                    tarjan(v);
                    low[u] = min(low[u], low[v]);
                }
                else if(in[v]) {
                    low[u] = min(low[u], dfn[v]);
                }
            }
            if(dfn[u] == low[u]) {
                scc_cnt++;
                while(1) {
                    int v = stk[top--];
                    belong[v] = scc_cnt;
                    in[v] = 0;
                    ou[v] = ++sign;
                    if(v == u) break;
                }
            }
        }
        // if ans == 0, choose i, else choose i + n
        int solve() {
            for(int i = 1; i <= n * 2; i++) if(!dfn[i]) tarjan(i);
            for(int i = 1; i <= n; i++) if(belong[i] == belong[i + n]) return 0;
            for(int i = 1; i <= n; i++) ans[i] = ou[i] > ou[i + n];
            return 1;
        }
    }
  • 相关阅读:
    gevent
    pymongo的数组操作
    pymongo的聚合操作
    python操作redis的情况总结
    协程
    3
    6
    10
    4
    5
  • 原文地址:https://www.cnblogs.com/CJLHY/p/11564487.html
Copyright © 2011-2022 走看看