其实以前写过关于$2-SAT$的,但是那时的自己太懵懂了。

这是以前写过的文章link

关于$2-SAT$,其实就想说两件事情。

$2-SAT$边建立的逻辑

$2-SAT$边建立的逻辑是必须关系,若$(u,v)$连边的话,说明如果要选择$u$号节点就必须要选择v号节点。

举个例子,假设有$2$个团队,若第一组团队编号为$(1,2)$,另一组编号为$(3,4)$

若$1,3$是仇人,则要连边$(1,4),(3,2)$,但是为什么不连$(4,1)$呢,因为不是如果要选择$4$就要选择$1$的,这是要必须关系

判断并输出解法

先说怎么判断有无解吧,就比如上个例子中$(1,2)$通过缩点后若在一个强连通分量中,则无解,因为若要选择$1$就要选择$2$,但是不能同时选择,所以无解。

现在就只剩有解的情况了,我们会发现一个问题,怎么去抉择呢。

首先,$tarjan$是拓扑序的倒序,这应该谁都懂吧。

然后呢,我们会发现若要选择的话应该选择出度最小的(应为此点没有对后来的点有限制),就是建完反图后的入度为$0$的点。并且我们就是要选择出度最小的点吧,而$tarjan$又是反拓扑的,就是所在的$scc$小的吧,所以就每次选择$scc$最小的点即可。或许有人会质疑这个算法的正确性,第一就是刚才说的,第二就是我们会发现因为$scc$是从$1$开始的,所以说我们连边时进行传到过程中才是一个逐渐递增的过程。然后是不是什么都不用说了。

模板 $2-SAT$

link

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{
int f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return ans*f;
}
const int N=;
struct node{
int u,v,nex;
}x[N<<];
int head[N<<],cnt,n,m,dfn[N<<],low[N<<],sta[N<<],co[N<<],col,tot,num;
void tarjan(int f){
dfn[f]=low[f]=++num;
sta[++tot]=f;
for(int i=head[f];i!=-;i=x[i].nex){
if(!dfn[x[i].v]) tarjan(x[i].v),low[f]=min(low[f],low[x[i].v]);
else if(!co[x[i].v]) low[f]=min(low[f],dfn[x[i].v]);
}
if(low[f]==dfn[f]){
co[f]=++col;
while(sta[tot]!=f){
co[sta[tot]]=col;
tot--;
}tot--;
}return;
}
void add(int u,int v){
x[cnt].u=u,x[cnt].v=v,x[cnt].nex=head[u],head[u]=cnt++;
}
int opp(int pos,int x){
if(x==) return pos+n;
return pos;
}
int st(int pos,int x){
if(x==) return pos;
return pos+n;
}
bool judge(){
for(int i=;i<=*n;i++)
if(co[i]==co[i+n]) return ;
return ;
}
int main(){
memset(head,-,sizeof(head));
n=read(),m=read();
for(int i=;i<=m;i++){
int p1=read(),u=read(),p2=read(),v=read();
add(opp(p1,u),st(p2,v)),add(opp(p2,v),st(p1,u));
}
for(int i=;i<=*n;i++)
if(!dfn[i]) tarjan(i);
if(!judge()){printf("IMPOSSIBLE\n");return ;}
printf("POSSIBLE\n");
for(int i=;i<=n;i++){
if(co[i]<co[i+n]) printf("0 ");
else printf("1 ");
}
}

关于2-SAT的更多相关文章

  1. 多边形碰撞 -- SAT方法

    检测凸多边形碰撞的一种简单的方法是SAT(Separating Axis Theorem),即分离轴定理. 原理:将多边形投影到一条向量上,看这两个多边形的投影是否重叠.如果不重叠,则认为这两个多边形 ...

  2. POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  3. Map Labeler POJ - 2296(2 - sat 具体关系建边)

    题意: 给出n个点  让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...

  4. 学习笔记(two sat)

    关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...

  5. LA 3211 飞机调度(2—SAT)

    https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...

  6. HIT 1917 2—SAT

    题目大意:一国有n个党派,每个党派在议会中都有2个代表, 现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会. 已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委 ...

  7. 2 - sat 模板(自用)

    2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一  POJ 3207 Ikki's Story IV ...

  8. SAT考试里最难的数学题? · 三只猫的温暖

    问题 今天无意中在Quora上看到有人贴出来一道号称是SAT里最难的一道数学题,一下子勾起了我的兴趣.于是拿起笔来写写画画,花了差不多十五分钟搞定.觉得有点意思,决定把解题过程记下来.原帖的图太小,我 ...

  9. 世界碰撞算法原理和总结(sat gjk)

    序言 此文出于作者的想法,从各处文章和论文中,总结和设计项目中碰撞结构处理方法.如有其它见解,可以跟作者商讨.(杨子剑,zijian_yang@yeah.net). 在一个世界中,有多个物体,物体可以 ...

  10. hdu 4115 (2—SAT)

    题意:两个人石头剪刀布,一个人的出法已确定,另一个人的出法有一定约束,某两次要相同或者不同,问你第二个人能否全部都不失败. 思路:根据Bob出的情况,我们可以确定每次Alice有两种方案. R与P,S ...

随机推荐

  1. Linux命令之mount挂载

    挂载概念 Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”. 注意:“挂载点” ...

  2. 使用python实现用微信远程控制电脑

    首先,我们要先看看微信远程控制电脑的原理是什么呢? 我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为远程控制的渠道,我们用Python自动登录邮箱检测邮件,当我 ...

  3. 关于php的array_diff和array_diff_assoc的使用总结

    关于php的array_diff和array_diff_assoc的使用总结 2015-11-07 17:01 184人阅读 评论(0) 收藏 举报  分类: php学习感想(1)  版权声明:本文为 ...

  4. Daily Srum 10.28

    这两天我们和其他两组进行了一次会议,主要讨论的是用什么框架来搭建这个平台.在线系统的那一组希望我们用nutch.solr.hbase这一套工具,这对于我们两组来说是一次挑战,毕竟我们一开始用的是关系型 ...

  5. 2-Third Scrum Meeting-20151203

    任务安排 闫昊: 今日完成:请假.(编译+计组,压力有点大) 明日任务:设计本地数据库. 唐彬: 今日完成:请假.(编译+计组,压力有点大) 明日任务:阅读ios客户端代码. 史烨轩: 今日完成:请假 ...

  6. linux 常用命令-配置登陆方式

    使用阿里云服务器,启动实例(ubuntu 7.4,密码登录)后,通过xshell登陆,但是发现xshell中密码登录是灰色禁用的,很惆怅啊,明明设置的就是密码登录,在xshell中找了一通设置发现并没 ...

  7. C#窗体随机四则运算 (第四次作业)

    ---恢复内容开始--- 增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况:2)用 ...

  8. 文献:Technology-related Disasters:A Survey toward Disaster-resilient Software Defined Networks

    DISASTER的定义和影响(本文中) 定义范围: 自然灾害,比如洪水.地震等造成一定范围类的节点故障: 恶意攻击,DDOS攻击或者电磁脉冲攻击造成节点故障: 技术相关的问题,配置错误或者误操作等: ...

  9. C#简单窗体应用程序(三)

    使用C#创建窗体应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计歌曲列表界面,效果如下: 第一步:创建项目: ...

  10. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

      梯度下降法作为机器学习中较常使用的优化算法,其有着三种不同的形式:批量梯度下降(Batch Gradient Descent).随机梯度下降(Stochastic Gradient Descent ...