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

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

建个有向图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. K-th Number Poj - 2104 主席树

    K-th Number Poj - 2104 主席树 题意 给你n数字,然后有m次询问,询问一段区间内的第k小的数. 解题思路 这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简 ...

  2. python 字符串 string模块导入及用法

    字符串也是一个模块,有自己的方法,可以通过模块导入的方式来调用 1,string模块导入 import string 2,  其用法 string.ascii_lowercase string.dig ...

  3. 基于 Python 的自定义分页组件

    基于 Python 的自定义分页组件 分页是网页中经常用到的地方,所以将分页功能分出来,作为一个组件可以方便地使用. 分页实际上就是不同的 url ,通过这些 url 获取不同的数据. 业务逻辑简介 ...

  4. NGUI的HUD Text的扩展插件学习--(HUDText)的使用

    一,我们先添加一个空的游戏对象,在菜单中找到这个添加空的游戏对象 二,然后我们给该对象添加HUDText,然后给这个添加字体 三,我们添加个脚本,代码如下: using UnityEngine; us ...

  5. FFmpeg从入门到出家(HEVC在RTMP中的扩展)

    由金山云视频云技术团队提供:FFmpeg从入门到出家第三季: 为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具 ...

  6. 解决 vue-cli构建项目自动打开浏览器问题

    1.打开项目下的config/index.js 2.找到module.exports的 dev下的 autoOpenBrowser ,将 false 改成 true 3.控制台输入:npm run d ...

  7. 按字节读取txt文件缓存区大小设置多少比较好?

    读取 txt 文件常规写法有逐行读取和按照字节缓存读取,那么按照字节缓存读取时,设置缓存区多大比较好呢?百度了一下,没发现有说这个问题的,自测了一把,以事实说话. 常规读取方法如下: // 字节流读取 ...

  8. 阿里P7前端需要哪些技能

    原谅我copy过来的,但是这个条理很清楚很有借鉴意义 前言 以下是从公众号的文章中获取到的一位阿里的前端架构师整理的前端架构p7的技能图谱,当然不是最完整.最系统的,所以之后我会一直维护更新这里的内容 ...

  9. 输vim /etc/rc.d/init.d/mysqld 报错 …..localdomain.pid

    在安装MySQL的过程中出现以下错误: 本人解决方法是: ps aux | grep mysqld 罗列出所有关于mysqld的进程,然后把关于mysqld的进程都kill了.

  10. oracle 使用escape转义%与_匹配字符为本来含义

    举例: 查找姓名为M%的员工. select * from employee where staff_name like 'M\%' escape '\';