HDU 1824 2-sat算法


分析:这题就是2-sat的模板题,首先应该写出布尔方程的表达式,然后根据合取范式的格式,利用2-sat建边的“必须”原则来建图就可以了。


代码:

//O(m)求2-sat,此处下标从0开始
#pragma comment(linker,"/STACK:102400000,102400000")
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;   //记得必要的时候改成无符号
const int maxn=6005;   //点数
const int maxm=2000005;   //边数
const int INF=1000000000;
struct EdgeNode
{
    int from;
    int to;
    int next;
}edge[maxm];
int head[maxn],cnt;
void add(int x,int y)
{
    edge[cnt].from=x;edge[cnt].to=y;edge[cnt].next=head[x];head[x]=cnt++;
    //printf("    %d %d\n",x,y);
}

void init()
{
    cnt=0;
    memset(head,-1,sizeof(head));
}

int dfn[maxn],low[maxn],ins[maxn],cixu,scc_count,n,ru[maxn],chu[maxn],sd[maxn];
stackS;

void dfs(int u)
{
    int v,x;
    dfn[u]=low[u]=++cixu;
    S.push(u);
    ins[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        v=edge[i].to;
        if(!dfn[v]){
            dfs(v);
            low[u]=min(low[u],low[v]);
        }
        else if(ins[v])
            low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        scc_count++;
        do
        {
            x=S.top();
            S.pop();
            sd[x]=scc_count;
            ins[x]=0;
        }while(x!=u);
    }
}

void tarjan()
{
    for(int i=0;i


你可能感兴趣的:(2-sat)