2-sat.又学到了一种使用的方法:当确定选择某中状态A时,从它的对立状态A^1引一条边add(A^1,A),从而使凡是dfs经过对立状态,必然return false:即保证若存在一种可能性,必然是经过该状态A的. 题意:m个人对n个方案投票,每人之多投4票,是否存在一种方案使每个人所投的一半以上的票被采纳.依次输出每个议题最终的结果. 1.注意是一半以上,我一开始理解成一半,结果无法根据必然性建边.<=2票则都被采纳,<=4票则至多有一票不被采纳. 2.输出时要注意,因为每个议题的结果都不…
题意:有 m 个人对 n 个方案投票,每个人最多只能对其中的4个方案投票(其他的相当于弃权),每一票要么支持要么反对.问是否存在一个最终决定,使得每个投票人都有超过一半的建议被采纳,在所有可能的最终决定中,哪些方案的态度是确定的. 析:注意这个题是超过一半,是TwoSat 算法,对于投小于三票的,他的票必须都成立(因为要超过一半),同理大于两票的最多一票不成立,这样考虑就是twosat的问题了,也就是说对于小于三票的,那么就相当于是标记了必须成立,对于大于两票的,那么就是如果有一个不成立,那么其…
题意: 有一些部长需要对某些账单进行投票. 一个部长最多对4个账单进行投票,且每票对一个账单通过,要么否决. 问是否存在一个方案使得所有部长有超过半数的投票被通过,如果有,那么说明哪些账单的决定是明确的,哪些是不明确的:否则说明不可能. 思路: 2-SAT. 一开始觉得这是一个k-SAT问题,但是因为有着所有部长的投票有超过半数被通过这个条件存在,所以可以简化. 对于一票或者两票的部长,那么所有条件都要被满足,意味着某些账单的决定是确定. 如何表示一个条件是确定的呢,这是从这个题中学习到的一点,…
题目大意:有n个问题,m个人来投票,没人最多投4票,问该怎样决定才能使每个人都有超过一半的票数被认可? 题目分析:2-SAT问题.如果某个人投的票数少于2,则这两票军被采纳,如果票数至少三票,则最多有一票可以不被采纳,这意味着这个人的投的任意两票之间有矛盾,是“二者取一”的关系. 代码如下: # include<iostream> # include<cstdio> # include<vector> # include<queue> # include&l…
题目链接:https://cn.vjudge.net/contest/209474#problem/C 题目大意: 一共有m个提案,n个政客,每个政客都会对一些提案(最多四个)提出自己的意见——通过或者不通过.一个政客获得满意结果,当且仅当他的意见被满足了超过(注意是超过,即大于)一半,请问有没有这样的方案,使n个政客都满意?如果存在,输出所有方案.(这个所有的意思是一个提案如果只能是“通过”决策(在所有方案里都是通过),输出’y‘,只能不通过输出’n’,可以通过也可以不通过(有的方案是y,有的…
题意:给一幅地图,P为起点,D为终点,'*'为传送阵,到达传送阵可以传到任意一个其他的传送阵,传到以后可以正常走或者再传回来,问P->D最短步数. 分析:这题一定要细心,分析要到位才能搞定,错一点都WA.有两种思路: 1.走到一个传送点之后,将所有能传到的地方都加入队列,然后清除传送阵向量(vector),因为以后不用再互相传了,对于某个传送阵k,以后从别的点传到k的效果还不如从这个点传到k,所以清空传送阵,又因为其他传送阵可以传回来,此时传送阵向量要把当前传送阵push_back进去,以便其他…
题意:有n 个议案,m 个大臣,每个大臣会对其中的ki 个议案投票,为赞成或反对.现要你判断是否存在一种方案,使得每个大臣有大于一半的投票被满足.若存在,还需判断某个议案是不是一定要通过,或者一定不能通过. 数据范围:n≤1000,m≤5000,1≤ki≤4 首先这是一些布尔变量的真假的问题,这让我们联想到2-SAT 仔细观察题意发现,k=1,2的时候所投的1个/2个提议的结果必须和投的票相同,k=3和4的时候最多允许有一个提议的结果和投的票不同. 因为2-SAT问题是对两个变量的约束,我们发现…
题意: 有n架飞机需要着陆.每架飞机有两种选择,早着陆或者晚着陆,二选其一.现在为了保证飞机的着陆安全,要求两架着陆的飞机的时间间隔的最小值达到最大. 分析: 最小值最大问题我们想到二分答案.对于猜测值x,判断是否有一种方案使相邻两着陆时间都不小于x. 如果两架飞机的某着陆时间差小于p,证明不能同时选择.根据这个条件建图,再用2-SAT判断是否有解即可. 代码如下: #include<cstdio> #include<cstdlib> #include<cstring>…
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a boolean operator op (one of AND, OR, XOR) and an integer c (0 ≤ c ≤ 1). One Katu is solvable if one can find each vertex Vi a value Xi (0 ≤ Xi ≤ 1) s…
关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 poj 2723 poj 2749 关于具体算法 首先此算法只对于存在类似于一个点选了另一个点就不能选这样的条件,并且每个点只有两种状态(一般是选或不选),不然是个NP问题 大体做法就是先转换模型,把每个点拆成两个,一个代表取,一个代表不取,(注意:图中边代(u->v)代表取u就一定要取v) 至于判…