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

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

建个有向图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杭电多校第五场][hdu6630]permutation 2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6630 题意为求出1-n,n个数的全排列中有多少种方案满足第一位为x,第n位为y,且相邻数字绝对值之差不 ...

  2. Appium+Python之元素定位和操作

    一.常用识别元素的工具 uiautomatorviewer:Android SDK自带的一个工具,在tools目录下     二.元素定位   1.格式:find_element_by_定位方式(va ...

  3. PS使用记录:人像(证件照)更换背景

    PS使用记录:人像(证件照)更换背景 参考:非常干净的抠羽毛ps教程抠图羽毛 (1)准备2019PS,原图 (2)选择人像:选择->主体 (3)边缘处理:选择 ->选择并遮住 ->选 ...

  4. ReentrantReadWriteLock实现原理

    在java并发包java.util.concurrent中,除了重入锁ReentrantLock外,读写锁ReentrantReadWriteLock也很常用.在实际开发场景中,在使用共享资源时,可能 ...

  5. etc/pass命令列表

    用户 密码 用户UID 用户组GID 备注 home目录位置 默认shell root x 0 0 root /root /bin/bash daemon x 1 1 daemon /usr/sbin ...

  6. js中跳出forEach循环

    缘由:近期在项目中使用lodash.js中的_.foreach方法处理数据,需要在满足条件时结束循环并不执行后面的js代码. 因为foreach中默认没有break方法.在尝试中使用了return f ...

  7. 一、touch.js

    一.touch.js 1.引用链接: <script src="https://cdn.bootcss.com/touchjs/0.2.14/touch.min.js"> ...

  8. 快速排序的python实现

    def quick_sort(array, left, right): if left < right: base_index = division(array, left, right) qu ...

  9. gay绿论第一章两点注意事项

    1.不可能事件的概率为0,但概率为0的事件不一定是不可能事件,例如从自然数中取一个数结果是1的概率,从极限角度看,分子是1,分母是∞,结果是0,但它显然是有可能发生的,所以不是不可能事件. 2.两事件 ...

  10. k8s阅读笔记3-k8s的网络解析

    前言 阅读地址https://rootsongjc.gitbooks.io/kubernetes-handbook/content/concepts/flannel.html k8s客户端的启动 顺序 ...