• 2-SAT算法


    例题:

    https://www.luogu.org/problem/P4782

    算法:

    算法所求问题:

    这个算法主要是求有n个人,每个有m个要求,要求只可能是1或0的情况(及是或不是,要或不要......),且每个要求只需满足其一即可,求是否有可行的分配方案(当然,也可以求出那个可行的分配方案)

    算法前置知识:

    Tarjan求强连通分量,拓扑序

    算法主要思路:

    如何求出能否有一种方案使得所有人的条件满足其一

    首先声明一下:a --> b(a向b连一条边)表示如果慢足a这个条件,就必须满足b这个条件;a本身表示选a,a + n表示不选a。开始说思路:如果有一个要求是选a或者不选b,那么我们可以从a + n向b + n连一条边(如果不选a了,就必须不选b,否则就不满足这个要求了),然后我们也从b向a连一条边(如果选b了,就必须选a,否则就不满足要求了)。建完图之后,我们可以用Tarjan求强连通分量,如果有一个逆条件(即不能选A)和正条件(即选A)在同一个强连通分量里,那么这个图就GG了qwq那么这几个条件就无法同时满足;反之则一定可以。

    如何求出这个方案是什么(在求出有方案的情况下)

    这个需要用到拓扑序(即当前点是第几个被搜到的),例如:如果有一个点A它的选连着它的不选,那么就代表选A的选就必须选A的不选(就冲突了),所以我们只能选A的不选

  • 相关阅读:
    常用C# 6.0 常用 新特性
    VS 编译总是出现错误: "LC.EXE 已退出,代码为1"
    C# XML封装
    VS 2015秘钥
    写入Txt文本信息
    C# 7.0 新特性
    Winform 弹框增加确定按钮并点击确定后进行下一步操作
    VS 代码过长自动换行
    C# 6.0 新特性
    string::npos 是什么 c++ /STL
  • 原文地址:https://www.cnblogs.com/qqq1112/p/11373590.html
Copyright © 2020-2023  润新知