随笔分类 - 2-SAT问题
摘要:思路:将每个回合的平手和赢最为一对对立状态。那么后面就是2-SAT判断了。#include#include#include#include#include#include#define Maxn 20010using namespace std;map g[Maxn];int vi[Maxn],head[Maxn],dfn[Maxn],low[Maxn],e,n,lab,top,num,id[Maxn],Stack[Maxn],wh[Maxn],hh[4][4];struct Edge{ int u,v,next;}edge[100000];void init()//初始化{ me...
阅读全文
摘要:思路:裸的2-SAT。#include#include#include#include#include#include#include#include#include#include#include#define Maxn 2010#define Maxm 100010#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x head[Maxn];void init(){ memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); lab=num=to...
阅读全文
摘要:思路:如题#include#include#include#include#include#define Maxm 100010#define eps 1e-4using namespace std;int vi[220],head[220],e,n,m,id[220],lab,num,dfn[220],low[220],Stack[220],top;double Max;struct Point{ double x,y;}p[210];struct Edge{ int u,v,next;}edge[Maxm];void init(){ memset(vi,0,sizeof(...
阅读全文
摘要:思路:我们需要判断是否有满足的a[n],其实也就是对每一个二进制位进行判断,看是否有满足的。那么我们每次取出一个二进制位,这样每一位只有0,1两种状态,就成了比较典型的2-SAT问题了。#include#include#include#include#include#define Maxn 1010#define Maxm Maxn*Maxnusing namespace std;int vi[Maxn],head[Maxn],dfn[Maxn],low[Maxn],e,n,lab,top,num,m,id[Maxn],Stack[Maxn],B[510][510];struct Edge{
阅读全文
摘要:思路:将线段按开始点的升序排序,对线段尾节点进行判断,若存在交叉,那么这两条线段就不能同时在内或同时在外。这样将每条线段在内和在外看成两个状态i和i',i表示线段在内,i'表示线段在外。假使线段i和线段j相交,那么i和j是矛盾,且i'和j'是矛盾。具体见代码#include#include#include#include#include#define Maxn 2010#define Maxm Maxn*Maxnusing namespace std;int vi[Maxn],head[Maxn],dfn[Maxn],low[Maxn],e,n,lab,top,
阅读全文
摘要:思路:将每对夫妻看成是对立状态,每个不正常关系都是一个矛盾,按2-SAT的方式建边。最后建一条新娘到新郎的边。具体看注释#include#include#include#include#include#define Maxn 62#define Maxm Maxn*Maxnusing namespace std;int vi[Maxn],head[Maxn],dfn[Maxn],low[Maxn],e,n,lab,top,num,id[Maxn],Stack[Maxn],in[Maxn],Hash[Maxn],col[Maxn];struct Edge{ int u,v,next;}ed...
阅读全文
摘要:思路:首先将hate和friend建边求其次2-SAT问题,判断是否能有解,没解就输出-1,否则用二分枚举最大的长度,将两个barn的距离小于mid的看做是矛盾,然后建边,求2-SAT问题。找出最优解。#include#include#include#include#include#include#define Maxn 3010#define Maxm 1000000using namespace std;int dfn[Maxn],low[Maxn],vi[Maxn],head[Maxn],e,n,m,lab,top,Stack[Maxn],num,id[Maxn],A,B,ss;stru
阅读全文
摘要:思路:将每个点拆分为两个点 a与a',a表示为1,a'表示为0。那么条件给的每个边自然就会存在矛盾,然后根据2-SAT建边就行了。#include#include#include#include#include#include#define Maxn 3010#define Maxm 1000000using namespace std;int dfn[Maxn],low[Maxn],vi[Maxn],head[Maxn],e,n,m,lab,top,Stack[Maxn],num,id[Maxn];struct Edge{ int u,v,next,l;}edge[Maxm]
阅读全文
摘要:思路:二分枚举能开的门的数量,将每次枚举转换成2-SAT问题。这里存在的矛盾是假设有门上a,b两个锁,a锁对应于1号钥匙,而一号钥匙的配对是2号钥匙,b锁对应于3号钥匙,3号的配对是4号钥匙。那么2号和4号就不能同时被选,否则有a,b锁的门就开不了。#include#include#include#include#include#define Maxn 3010#define Maxm 1000000using namespace std;int dfn[Maxn],low[Maxn],vi[Maxn],head[Maxn],f[Maxn],e,n,m,lab,top,Stack[Maxn],
阅读全文

浙公网安备 33010602011771号