POJ 3678 Katu Puzzle
Description
给出一个关系,包括 And,Xor,Or 问是否存在解.
Sol
经典的2-SAT问题.
把每个值看成两个点,一个点代表选 \(0\) ,另一个代表选 \(1\) .
首先来看 Xor :
如果两个值异或起来为 \(1\) :那么连边 \((i_0,j_1),(i_1,j_0),(j_0,i_1),(j_1,i_0)\) .
否则 连边 \((i_0,j_0),(i_1,j_1),(j_0,i_0),(j_1,i_1)\) .
然后是 And.
如果两个值 And 起来为 \(1\) :连边 \((i_0,i_1),(j_0,j_1)\)
否则 连边 \((i_1,j_0),(j_1,i_0)\)
最后是 Or.
如果两个值 Or 起来为 \(1\) :连边 \((i_0,j_1),(j_1,i_0)\)
否则 连边 \((i_1,i_0),(j_1,j_0)\) .
Tarjan 缩一下环判断一下两个点是否在一个环中就可以了.
Code
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std; const int N = 2005; int n,m,cnt,cntb;
vector< int > g[N];
int d[N],b[N],ins[N];
int stk[N],top; inline int in(int x=0,char ch=getchar()){ while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; }
void Add_Edge(int fr,int to) { g[fr].push_back(to); }
void Tarjan(int u,int fa) {
int dfsn=++cnt;d[u]=cnt,ins[u]=1,stk[++top]=u;
for(int i=0,v;i<(int)g[u].size();i++) {
v=g[u][i];
if(!d[v]) Tarjan(v,u);
if(ins[v]) d[u]=min(d[u],d[v]);
}if(dfsn==d[u]) {
for(++cntb;stk[top]!=u;top--) {
b[stk[top]]=cntb,ins[stk[top]]=0;
}ins[stk[top]]=0,b[stk[top--]]=cntb;
}
// cout<<u<<":"<<dfsn<<" "<<d[u]<<endl;
}
int main() {
// freopen("in.in","r",stdin);
n=in(),m=in();
char opt[50];
for(int i=1;i<=m;i++) {
int u=in(),v=in(),w=in();
scanf("%s",opt);
if(u>v) swap(u,v);
if(opt[0]=='X') {
if(w) {
Add_Edge(u*2,v*2+1);
Add_Edge(u*2+1,v*2);
Add_Edge(v*2,u*2+1);
Add_Edge(v*2+1,u*2);
}else {
Add_Edge(u*2,v*2);
Add_Edge(v*2,u*2);
Add_Edge(u*2+1,v*2+1);
Add_Edge(v*2+1,u*2+1);
}
}else if(opt[0]=='A') {
if(w) {
Add_Edge(u*2,u*2+1);
Add_Edge(v*2,v*2+1);
}else {
Add_Edge(u*2+1,v*2);
Add_Edge(v*2+1,u*2);
}
}else {
if(w) {
Add_Edge(u*2,v*2+1);
Add_Edge(v*2,u*2+1);
}else {
Add_Edge(u*2+1,u*2);
Add_Edge(v*2+1,v*2);
}
}
}
for(int i=0;i<2*n;i++) if(!d[i]) Tarjan(i,i);
// for(int i=0;i<2*n;i++) cout<<b[i]<<" ";cout<<endl;
for(int i=0;i<2*n;i++) if(b[i]==b[i^1]) return puts("NO"),0;
return puts("YES"),0;
}
POJ 3678 Katu Puzzle的更多相关文章
- POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9987 Accepted: 3741 Descr ...
- poj 3678 Katu Puzzle(2-sat)
Description Katu Puzzle ≤ c ≤ ). One Katu ≤ Xi ≤ ) such that for each edge e(a, b) labeled by op and ...
- POJ 3678 Katu Puzzle (经典2-Sat)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6553 Accepted: 2401 Descr ...
- 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 ...
- POJ 3678 Katu Puzzle (2-SAT)
Katu Puzzle Time Limit: 1000MS ...
- poj 3678 Katu Puzzle 2-SAT 建图入门
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
- poj 3678 Katu Puzzle(Two Sat)
题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...
- POJ 3678 Katu Puzzle 2-SAT 强连通分量 tarjan
http://poj.org/problem?id=3678 给m条连接两个点的边,每条边有一个权值0或1,有一个运算方式and.or或xor,要求和这条边相连的两个点经过边上的运算后的结果是边的权值 ...
- POJ 3678 Katu Puzzle(强连通 法)
题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...
随机推荐
- C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 面向数据库SQL语句的应用开发二
很多传统企业.包括系统集成类的IT企业,若不是从事专业软件开发领域的,能做出一套适合本公司企业信息化的灵活的信息系统还是很有难度的,还有一些已经多年不写程序的资深开发人员,初学者,都难把一个整套系统实 ...
- Jumony Core 3,真正的HTML引擎,正式版发布
Jumony是一个开源项目,已经有三年的历史了,在这三年中,秉承提供给.NET程序员完整的HTML掌控能力,Jumony历经无数次的改进,终于进入了一个新的阶段.Jumony Core 3是一个真正意 ...
- 几个常用的CV知识点
刚结束一段实习,图像算法工程师.总结一下图像算法的几个基本的操作,图像操作算子各式各样,各显神通,光是滤波filter这一个专题就可以有很多的技巧和功能. 我从做过的两个小项目入手, 简单介绍一下该项 ...
- VUE --- 给页面加点网络动态数据
这时候的页面都是静态的(数据在写程序的时候已经固定了不能修改),而每个应用基本上都会请求外部数据以动态改变页面内容.对应有一个库叫 vue-resource 帮我们解决这个问题. 使用命令行安装 cn ...
- Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...
- 隐式意图启动一个Activity
隐式意图是通过指定一组动作或者属性实现,主要用于跨应用使用. 1.创建一个意图对象 Intent intent = new Intent(); 2.设置意图过滤器 intent.setAction(& ...
- redis 的源码编译安装
首先我们下载软件包到指定的目录下 tar -zxvf redis-2.8.19.tar.gz cd redis-2.8.19 make make PREFIX=/usr/local/redis ins ...
- TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- 用类(function(){})()实现点击显示index索引值的详解
code: <script type="text/javascript"> ; i < ; i++){ var btn = document.createElem ...
- 为开发者准备的 Android 函数库(2016 年版)
转载:http://www.androidchina.net/5922.html第三方函数库(译者注:包括第三方提供的 SDK,开源函数库)以惊人的方式助力着 Android 开发,借助这些其他开发人 ...