推荐几篇博客:https://blog.csdn.net/JarjingX/article/details/8521690 研究总结2-sat问题
https://blog.csdn.net/whereisherofrom/article/details/79417926 有向图强连通+2-sat问题
推荐几篇论文:https://wenku.baidu.com/view/afd6c436a32d7375a41780f2.html 由对称性问题解2-sat
https://wenku.baidu.com/view/0f96c3daa58da0116c1749bc.html 2-sat问题解法浅析
tarjan模板
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=20010; 6 const int maxm=50010; 7 struct edge{ 8 int to,nxt; 9 }edge[maxm]; 10 int head[maxn],tot; 11 int low[maxn],dfn[maxn],stack[maxn],belong[maxn]; 12 int index,top; 13 int scc; 14 bool vis[maxn]; 15 int num[maxn]; 16 17 void addedge(int u,int v) 18 { 19 edge[tot].to=v; 20 edge[tot].nxt=head[u]; 21 head[u]=tot++; 22 } 23 24 void tarjan(int u) 25 { 26 int v; 27 low[u]=dfn[u]=++index; 28 stack[top++]=u; 29 vis[u]=true; 30 for ( int i=head[u];i!=-1;i=edge[i].nxt ) { 31 v=edge[i].to; 32 if ( !dfn[v] ) { 33 tarjan(v); 34 low[u]=min(low[u],low[v]); 35 } 36 else if ( vis[v] ) low[u]=min(low[u],dfn[v]); 37 } 38 if ( low[u]==dfn[u] ) { 39 scc++; 40 do { 41 v=stack[--top]; 42 vis[v]=false; 43 belong[v]=scc; 44 num[scc]++; 45 } 46 while ( v!=u ); 47 } 48 } 49 50 void solve(int N) 51 { 52 memset(dfn,0,sizeof(dfn)); 53 memset(vis,false,sizeof(vis)); 54 memset(num,0,sizeof(num)); 55 index=scc=top=0; 56 for ( int i=1;i<=N;i++ ) { 57 if ( !dfn[i] ) tarjan(i); 58 } 59 } 60 61 void init() 62 { 63 tot=0; 64 memset(head,-1,sizeof(head)); 65 }