const int maxn = 100010;
int n, m;
vector <int> G[maxn*2];
bool mark[maxn*2];
int S[maxn*2], c;
int a[maxn], b[maxn], sum;
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()
{
for(int i = 0; i < n*2; i++)
G[i].clear();
memset(mark, 0, sizeof(mark));
}
void AddEdge(int u, int v, int x, int y)
{
u = u * 2 + x;
v = v * 2 + y;
G[u].push_back(v^1);
G[v].push_back(u^1);
}
bool solve()
{
for(int i = 0; i < n*2; i += 2)
{
if(!mark[i] && !mark[i+1])
{
c = 0;
if(!dfs(i))
{
while(c > 0)
mark[S[--c]] = false;
if(!dfs(i+1))
return false;
}
}
}
return true;
}
2-SAT模版
最新推荐文章于 2022-05-14 10:31:14 发布