zoukankan      html  css  js  c++  java
  • 图论--2-SAT--暴力染色法模板(字典序最小解) RQ的板子

    //暴力DFS,求字典序最小的解,也是求字典序唯一的方法
    #include<cstdio>
    #include<cstring>
    #include<vector>
    using namespace std;
    const int maxn=10000+10;
    struct TwoSAT
    {
        int n;//原始图的节点数(未翻倍)
        vector<int> G[maxn*2];//G[i]==j表示如果mark[i]=true,那么mark[j]也要=true
        bool mark[maxn*2];//标记
        int S[maxn*2],c;//S和c用来记录一次dfs遍历的所有节点编号
     
        void init(int n)
        {
            this->n=n;
            for(int i=0;i<2*n;i++) G[i].clear();
            memset(mark,0,sizeof(mark));
        }
     
        //加入(x,xval)或(y,yval)条件
        //xval=0表示假,yval=1表示真
        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);
        }
     
        //从x执行dfs遍历,途径的所有点都标记
        //如果不能标记,那么返回false
        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;
        }
     
        //判断当前2-SAT问题是否有解
        bool solve()
        {
            for(int i=0;i<2*n;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;
        }
    };
  • 相关阅读:
    uva 10129
    年化利率
    house买房原理,2019,第一版
    car二手车购买原理
    car购车翻译篇
    car配置篇
    健身原理
    语法学习,从句
    语法学习,简单语句
    名词解释
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798597.html
Copyright © 2011-2022 走看看