2-SAT的小总结(POJ 3683 POJ 3207)
记住几个最重要的公式:
xANDy=0<=>(x=>y′)AND(y=>x′)
xANDy=1<=>(x′=>x)AND(y′=>y)
xORy=0<=>(x=>x′)AND(y=>y′)
xORy=1<=>(x′=>y)AND(y′=>x)
xXORy=0<=>(x′=>y′)AND(x=>y)AND(y=>x)AND(y′=>x′)
xXORy=1<=>(x=>y′)AND(x′=>y)AND(y=>x′)AND(y′=>x)
连边 缩环 判一判是不是在一个环里(拓扑输出方案)
POJ 3207
这道题是X xor Y=1的形式
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int n,m,first[N],next[N],v[N],tot,T,cnt,jy,low[N],dfn[N],vis[N],stk[N],top,p[N];
struct Nod{int from,to;}node[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void addedge(int x,int y){add(x+n,y),add(x,y+n),add(y,x+n),add(y+n,x);}
void tarjan(int x){
low[x]=dfn[x]=++cnt;vis[x]=;stk[++top]=x;
for(int i=first[x];~i;i=next[i]){
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
else if(vis[v[i]])low[x]=min(low[x],dfn[v[i]]);
}
if(low[x]==dfn[x]){
T++;
do{
jy=stk[top--],vis[jy]=;p[jy]=T;
}while(jy!=x);
}
}
int main(){
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d",&node[i].from,&node[i].to);
if(node[i].from>node[i].to)swap(node[i].from,node[i].to);
}
for(int i=;i<=m;i++){
for(int j=;j<=m;j++){
if(i!=j&&node[j].from>=node[i].from&&node[j].from<=node[i].to&&node[j].to>=node[i].to)addedge(i,j);
}
}
for(int i=;i<=*n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=m;i++){
if(p[node[i].from]==p[node[i].to]){puts("the evil panda is lying again");return ;}
}puts("panda is telling the truth...");
}
POJ 3683
如果时间冲突-> X AND Y =0
(有一些trick省略了拓扑)
若缩完环以后i<i+n 就是开始
否则是结束
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=,M=*;
int n,x1,y1,x2,y2,dfn[N],low[N],vis[N],p[N],v[M],next[M],first[N],tot,cnt,stk[N],top,T,jy;
struct Node{int begin,end,last;}node[N];
void add(int x,int y){v[++tot]=y,next[tot]=first[x],first[x]=tot;}
bool check(int a,int b,int c,int d){return !(b<=c||d<=a);}
void tarjan(int x){
dfn[x]=low[x]=++cnt,vis[x]=,stk[++top]=x;
for(int i=first[x];i;i=next[i])
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
else if(vis[v[i]])low[x]=min(low[x],dfn[v[i]]);
if(low[x]==dfn[x]){T++;do jy=stk[top--],vis[jy]=,p[jy]=T;while(jy!=x);}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d:%d%d:%d%d",&x1,&y1,&x2,&y2,&node[i].last),
node[i].begin=x1*+y1,node[i].end=x2*+y2;
for(int i=;i<=n;i++)
for(int j=;j<i;j++){
if(check(node[i].begin,node[i].begin+node[i].last,node[j].begin,node[j].begin+node[j].last))add(i,j+n),add(j,i+n);
if(check(node[i].begin,node[i].begin+node[i].last,node[j].end-node[j].last,node[j].end))add(i,j),add(j+n,i+n);
if(check(node[i].end-node[i].last,node[i].end,node[j].begin,node[j].begin+node[j].last))add(i+n,j+n),add(j,i);
if(check(node[i].end-node[i].last,node[i].end,node[j].end-node[j].last,node[j].end))add(i+n,j),add(j+n,i);
}
for(int i=;i<=*n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=n;i++)if(p[i]==p[i+n]){puts("NO");return ;}
puts("YES");
for(int i=;i<=n;i++){
if(p[i]<p[i+n])printf("%02d:%02d %02d:%02d\n",node[i].begin/,node[i].begin%,(node[i].begin+node[i].last)/,(node[i].begin+node[i].last)%);
else printf("%02d:%02d %02d:%02d\n",(node[i].end-node[i].last)/,(node[i].end-node[i].last)%,node[i].end/,node[i].end%);
}
}
2-SAT的小总结(POJ 3683 POJ 3207)的更多相关文章
- POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)
POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题) Descripti ...
- POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10010 Accep ...
- POJ 3683 Priest John's Busiest Day (2-SAT+输出可行解)
题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...
- POJ 1496 POJ 1850 组合计数
Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8256 Accepted: 3906 Description Tran ...
- poj - 3683 - Priest John's Busiest Day(2-SAT)
题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...
- poj 3683(2-sat+输出一组可行解)
题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...
- poj 3683(2-SAT+SCC)
传送门:Problem 3683 https://www.cnblogs.com/violet-acmer/p/9769406.html 参考资料: [1]:挑战程序设计竞赛 题意: 有n场婚礼,每场 ...
- POJ 3683 Priest John's Busiest Day (2-SAT)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6900 Accept ...
- poj 3683(2-sat+拓扑排序)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11127 Accep ...
随机推荐
- Oracle,sqlserver,mySQl的区别和联系:
1.日期处理方式 2.对保留字和关键字的处理方式: Oracle,sqlserver,mySQl的保留字不可以用作列字段,关键字可以,但他们对关键字的处理方式又不同: Oracle:关键字作为列时:用 ...
- 16.2 【C# 5】调用者信息特性
16.2.1 基本行为 .NET 4.5引入了三个新特性(attribute),即 CallerFilePathAttribute . CallerLineNumber- Attribute 和 Ca ...
- soui edit passwrod模式下禁用输入法
一直在用soui做客户端界面,今天发现密码edit在中文输入法下不能输入密码.我在想难道不是这样吗,密码就该用英文输入法啊. 然后我就用mfc的做了个demo,发现mfc的edit在密码模式下是可以用 ...
- UNIX C 总结
--day01--王建立QQ:2529866769今天的内容:一.计算机的框架什么是操作系统?(汽车)加油系统 油门 用户跟加油子系统交互的窗口.(接口)方向系统 方向盘 用户跟方向系统的交互接口.导 ...
- C++ API实现创建桌面快捷方式
#include<windows.h> #include <string> #include <shellapi.h> #include <shlobj.h& ...
- java面试题(转)
1.面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...
- 29. 误拼写时的fuzzy模糊搜索技术
搜索的时候,可能输入的搜索文本会出现误拼写的情况,这时就需要es为我们进行智能纠错 比如有两个文档: doc1: hello world doc2: hello java 现在要搜索:hall ...
- Linux 实用指令(4)
目录 实用指令 1.指定运行级别 2.切换到指定运行级别的指令 3.帮助指令 3.1man获得帮助信息 3.2help指令 4.文件目录类 4.1pwd指令 4.2 ls指令 4.3 cd指令 4.4 ...
- vue+better-scroll 下拉刷新,上拉加载更多
better-scroll 来做下拉刷新和 上拉加载 特别方便. 安装好vue脚手架和better-scroll 之后 直接复制粘贴就可以看到效果了 <template> <div ...
- hadoop-hdp-ambari离线安装记录
一.系统准备 1. 创建user——ambari 2.关闭防火墙 redhat6: chkconfig iptables off /etc/init.d/iptables stop redhat7: ...