今早用微云打的笔记...头大

我惊,这不是可爱的离散吗?!

建个有向图G,(Xi+Yi)加两边表示( ¬Xi+Yi)(Xi+ ¬Yi)
每个点(eg:A)加上 ¬A
下图为:(A->B)·( ¬B-> ¬A)·( ¬D->E)·( ¬E->D)·( ¬B->C)·( ¬C-> B)·(C-> ¬B)·(B-> ¬C)·(C->D)·(D->C)·(C-> ¬D)·( ¬D-> ¬C)

然后用Tarjan算法缩点

手热来了一发模板题https://www.luogu.org/problem/P4782

 #include <bits/stdc++.h>
using namespace std;
const int N=1e6+;
int n,m,a,b,fla,flb,cnt,head[N<<];
int dfn[N<<],low[N<<],vis[N<<],col[N<<],scnt,idx;
stack<int> st;
struct edge{
int to,next;
}e[N<<];
inline void addedge(int a,int b)
{
e[++cnt]={b,head[a]};
head[a]=cnt;
}
void tarjan(int u)
{
dfn[u]=low[u]=++idx;vis[u]=;
st.push(u);
for(int i=head[u];i;i=e[i].next)
{
if(!dfn[e[i].to]) tarjan(e[i].to),low[u]=min(low[u],low[e[i].to]);
else if(vis[e[i].to]) low[u]=min(low[u],dfn[e[i].to]);
}
if(low[u]==dfn[u])
{
scnt++;int v=-;
while(v!=u)
{
v=st.top();st.pop();
col[v]=scnt,vis[v]=;
}
}
}
int main()
{
for(scanf("%d%d",&n,&m);m--;){
scanf("%d%d%d%d",&a,&fla,&b,&flb);
int aa=fla^,bb=flb^;
addedge(a+aa*n,b+flb*n);
addedge(b+bb*n,a+fla*n);
}
for(int i=;i<=*n;i++)
if(!dfn[i]) tarjan(i);
for(int i=;i<=n;i++)
if(col[i]==col[n+i]) return puts("IMPOSSIBLE")&;
puts("POSSIBLE");
for(int i=;i<=n;i++) printf("%d%c",col[i]>col[n+i],i==n?'\n':' ');
}

然后又很智障得磕了http://acm.hdu.edu.cn/showproblem.php?pid=3062

因为初始化和下标问题还WA了半天,就简单YES、NO的我都能PE,自闭半小时

 #include <bits/stdc++.h>
using namespace std;
const int N=;
int n,m,a,b,fla,flb,cnt,scnt,idx,flag;
int head[N<<],dfn[N<<],low[N<<],vis[N<<],col[N<<];
stack<int> st;
struct edge{
int to,next;
}e[N*N];
void init()
{
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(vis,,sizeof(vis));
memset(low,,sizeof(low));
cnt=idx=scnt=flag=;
}
inline void addedge(int a,int b)
{
e[cnt]={b,head[a]};
head[a]=cnt++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++idx;vis[u]=;
st.push(u);
for(int i=head[u];i!=-;i=e[i].next)
{
if(!dfn[e[i].to]) tarjan(e[i].to),low[u]=min(low[u],low[e[i].to]);
else if(vis[e[i].to]) low[u]=min(low[u],dfn[e[i].to]);
}
if(low[u]==dfn[u])
{
scnt++;
int v=-;
while(v!=u)
{
v=st.top();st.pop();
col[v]=scnt,vis[v]=;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
scanf("%d",&m);
init();
while(m--)
{
scanf("%d%d%d%d",&a,&b,&fla,&flb);
addedge((a<<)+fla,((b<<)+flb)^);
addedge((b<<)+flb,((a<<)+fla)^);
}
for(int i=;i<*n;i++)
if(!dfn[i]) tarjan(i);
for(int i=;i<*n;i+=)
if(col[i]==col[i^]){puts("NO");flag=;break;}
if(!flag) puts("YES");
}
}

SAT算法的更多相关文章

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

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

  2. 学习笔记(two sat)

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

  3. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  4. HDU 2208 唉,可爱的小朋友(DFS)

    唉,可爱的小朋友 Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  6. 算法复习——2—sat(bzoj2199)

    题目: Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 ...

  7. 数据结构与算法 Big O 备忘录与现实

    不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新.        算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...

  8. Adaboost算法结合Haar-like特征

    Adaboost算法结合Haar-like特征 一.Haar-like特征 目前通常使用的Haar-like特征主要包括Paul Viola和Michal Jones在人脸检测中使用的由Papageo ...

  9. 2-SAT问题及其算法

    原文地址:http://www.cppblog.com/MatoNo1/archive/2011/07/13/150766.aspx [2-SAT问题]现有一个由N个布尔值组成的序列A,给出一些限制关 ...

随机推荐

  1. [2019杭电多校第一场][hdu6578]Blank(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 计数问题想到dp不过分吧... dp[i][j][k][w]为第1-i位置中4个数最后一次出现的 ...

  2. [常用类]Scanner 类

    Scanner 类 一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串. 该代码允许用户从System.in读取一个数字: Scanner sc = new Scanner(System.i ...

  3. Python的魔法方法??

    就是可以给你的类增加魔力的特殊方法,如果你的对象实现 (重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. __in ...

  4. 【Matlab技巧】工作区变量如何添加到Simulink中?

    对新手来说,在进行simulink仿真时想把工作区的变量添加到Simulink中,这样在如transfer模块中使用时可以直接输变量即可. 如这样: 那么如何对Simulink仿真文件自动赋值呢? 1 ...

  5. winsows CMD及Linux命令大全 欢迎补充

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) CMD命令锦集 1. gpedit.msc-----组策略 2. sndrec32--- ...

  6. CentOS6.5系统解决中文乱码问题

      一.    问题详情 Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK. ...

  7. git的HEAD指针操作

    学习操作HEAD指针,具体如下: - 查看Git版本信息 - 移动指针 - 通过移动HEAD指针恢复数据 - 合并版本 拓扑图:

  8. Python---基础---dict和set2

    2019-05-21 写一个程序来管理用户登陆系统的用户信息:登陆名字和密码,登陆用户账号建立后,已存在用户可以用登陆名字和密码重返系统,新用户不能用别人的用户名建立用户账号 ------------ ...

  9. Redirecting to /bin/systemctl restart mysql. service Failed to restart mysql.service: Unit not found.

    使用如下命令操作mysql即可: systemctl restart mysqld.service systemctl start mysqld.service systemctl stop mysq ...

  10. 用jquery实现图片轮播

    用jquery简单实现图片轮播效果,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ...