zoukankan      html  css  js  c++  java
  • 2-SAT

    2-SAT:

    n 个 bool 型变量, 有一些条件,要么 X 成立,要么 Y 成立。

    目标: 给每个变量赋值,使得所有条件成立。

    拆点: i 变量 为真表示2*i,为假 表示 2*i + 1;

    这时,如果有一个条件为 x 成立,y 不成立,就连一条边  2*i —> 2*j + 1;

    在这个图上搜索:

    对每个点,要么涂 2*i,要么涂 2*i + 1; 涂失败了,反悔从来,涂另一个。

    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));
        }
    
        // x = xval or y = yval
        void add_clause(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 < 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;
        }
    };
  • 相关阅读:
    CD4051
    sbit和sfr的定义
    EEPROM与FLASH的区别
    九LWIP学习笔记之最后的战役
    八LWIP学习笔记之用户编程接口(NETCONN)
    七LWIP学习笔记之传输控制协议(TCP)
    六LWIP学习笔记之用户数据报协议(UDP)
    java实现二叉查找树
    线程的锁对象
    MAP
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6091038.html
Copyright © 2011-2022 走看看