sat算法

题目链接点击打开链接


2—sat算法

对于任意两个点之间,每个点有两个状态,每两个点的状态是两个可以只取其一,是非否否的问题;

引用博客点击打开链接


板子是lrj上的p324

代码:

#include 
#include
#include
#include
#include
#include

using namespace std;
const int maxn=2000+5;
int x[maxn];
int y[maxn];
int mark[maxn];
vector G[maxn];
int S[maxn*2],c,n;
void add(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);
}
void init()
{
    for(int i=0;i<=n*2;i++)
        G[i].clear();
    memset(S,0,sizeof(S));
    c=0;
    memset(mark,0,sizeof(mark));
}
bool dfs(int x)
{
    if(mark[x^1])
        return false;
    if(mark[x])
        return true;
        S[c++]=x;
        mark[x]=1;
    for(int i=0;i0) mark[S[--c]]=0;
              if(!dfs(i+1))
                 return false;
            }
        }
    }
    return true;
}
int main()
{
    int r,l;
    cin>>n;
    cin>>r>>l;
    init();
    for(int i=0;i


你可能感兴趣的:(已补,图论)