2-sat板子

Posted cjlhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    

 

以上是关于2-sat板子的主要内容,如果未能解决你的问题,请参考以下文章

ad画pcb板怎样设置板子形状

STM32F407板子总是重启

arduino板子能做出来啥东西

nRF52832的板子,我想让LED2亮怎么写代码

LuoguP3390|模板矩阵快速幂|板子

树状数组板子