Twosat讲解详见算法入门经典1 324页
贴出白书模板
struct TwoSAT{
int n;
vector <int> G[maxn*2];
bool mark[maxn*2];
int S[maxn*2], c;
bool dfs(int x){
if(mark[x^1]) return false;
if(mark[x]) return true;
mark[x] = true;
S[c++] = x;
for(int i = 0; i < G[x].size(); i++){
if(!dfs(G[x][i])) return false;
}
return true;
}
void init(int n){
this->n = n;
for(int i = 0; i < n*2; i++) G[i].clear();
memset(mark, 0, sizeof(mark));
}
void addedge(int x, int xval, int y, int yval){
x = x * 2 + xval;
y = y * 2 + yval;
G[x^1].push_back(y);
G[y^1].push_back(x);
}
bool solve(){
for(int i = 0; i < 2*n; i += 2)
if(!mark[i] && !mark[i+1]){
c = 0;
if(!dfs(i)){//已经尝试过把i标记为true,然而不行,那么在尝试将i+1标记为真时,先把i的影响消掉
while(c > 0) mark[S[--c]] = false;
if(!dfs(i + 1)) return false;
}
}
return true;
}
}twosat;
例题推荐:
UVALIVE 3211 二分+TwoSAT
UVALIVE 3713 宇航员分组 TWOSAT
CF 766D TWOSAT http://blog.csdn.net/just_sort/article/details/60763945