其实以前写过关于$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. EF多个上下文迁移

    步骤: 1. Enable-Migrations 2. add-migration Initial -ConfigurationTypeName ModelOneDbConfig 3. update- ...

  2. shutil模块详解

    python常用模块目录 注意:shutil经常遇到路径需要转义一下才能执行,在字符串前面加 r转义  r" " 1.shutil常用方法 import shutil# 删除目录 ...

  3. nginx中location详解

    Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...

  4. java 第一次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:黎静  学号:20135338 成绩:             指导教师:娄嘉鹏  ...

  5. H-ui框架制作选项卡

    本案例运用H-ui框架,写了一个选项卡案例 1. html代码(固定这样写,用一个div包裹控制条tabBar和内容条tabCon) <div id="tab-index-carteg ...

  6. EF三种编程方式详细图文教程(C#+EF)之Code First

    Code First Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的 ...

  7. spring冲刺第八天

    昨天使人物成功的在地图上运动,并设计炸弹爆炸效果. 今天使炸弹可以炸死人物并可以炸没砖块,并试着将小怪加入地图. 遇到的问题:现在还没有将小怪加入地图,各个模块的整合是比较麻烦的,我还要在这方面下点功 ...

  8. 2018软工实践—Beta冲刺(3)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 软件接口编写修正 自动化测试脚本编写 技术文稿更新 展示GitHub当 ...

  9. arcgis for android apk太大

    原来大概都要20多M, 太大的原来是.so文件 arcgis for android api里面有armeabi armeabi-v7a  x86的 每个so都接近10m 要是都保留就20多m了 由于 ...

  10. Firefox插件开发学习总结

    2018.06.14 我们小组最初只准备开发运行在google上的知乎插件,但我们经过调研发现还有一大部分用户是使用的火狐浏览器,所以我们也准备制作火狐插件.以下是我学习了部分火狐插件制作知识后的总结 ...