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板子的主要内容,如果未能解决你的问题,请参考以下文章