poj3678
题目给的太裸,显然2sat;
还是用i表示xi=true(1), i+n表示xi=false(0)
这题唯一要说的是一种情况,当xi必须=true或xi必须=false这种情况下怎么弄
比如这道题出现的 假如条件要求xi or xj=0 那么
除了i+n--->j+n ,j+n--->i+n这两条边外
显然还要xi,xj都必须取false
这种情况我们好像不好用“推导出”的原理建边,
考虑这样的情况1,假如存在路径i+n--->i,但不存在路径i--->i+n
为什么这种情况是有解的,这是因为我们我们可以取i这个状态,这样就成立了,而取i+n这个状态是不成立的
现在我们要求一定只能取i+n这个状态
我们就连边i--->i+n
假如是情况1,加上这条边后,显然无解,符合。
假如i和i+n间都没有路径,显然加了这条边之后,就转化为情况1,这样显然只能取i+n这个状态
假如原来无解,加了边之后现在当然也无解
所以,对于xi,not xi,我们一定要取xi的话
我们就连边xi<--- not xi,这样就可以了
type node=record
next,point:longint;
end; var edge:array[..] of node;
v,f:array[..] of boolean;
be,st,dfn,low,p:array[..] of longint;
sum,h,t,a,b,c,i,n,m,len:longint;
s:string; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].next:=p[x];
p[x]:=len;
end; procedure tarjan(x:longint);
var i,y:longint;
begin
inc(h);
dfn[x]:=h;
low[x]:=h;
inc(t);
st[t]:=x;
f[x]:=true;
v[x]:=true;
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if not v[y] then
begin
tarjan(y);
low[x]:=min(low[x],low[y]);
end
else if f[y] then low[x]:=min(low[x],low[y]);
i:=edge[i].next;
end;
if dfn[x]=low[x] then
begin
inc(sum);
while st[t+]<>x do
begin
y:=st[t];
f[y]:=false;
be[y]:=sum;
dec(t);
end;
end;
end; begin
fillchar(p,sizeof(p),);
readln(n,m);
for i:= to m do
begin
read(a,b,c);
inc(a);
inc(b);
readln(s);
if s=' AND' then
begin
if c= then
begin
add(a,b+n);
add(b,a+n);
end
else begin
add(a,b);
add(b,a);
add(a+n,a);
add(b+n,b);
end;
end
else if s=' OR' then
begin
if c= then
begin
add(a+n,b+n);
add(b+n,a+n);
add(a,a+n);
add(b,b+n);
end
else begin
add(a+n,b);
add(b+n,a);
end;
end
else if s=' XOR' then
begin
if c= then
begin
add(a+n,b+n);
add(b+n,a+n);
add(a,b);
add(b,a);
end
else begin
add(a+n,b);
add(a,b+n);
add(b+n,a);
add(b,a+n);
end;
end;
end;
for i:= to *n do
if not v[i] then
begin
h:=;
t:=;
tarjan(i);
end; for i:= to n do
if be[i]=be[i+n] then
begin
writeln('NO');
halt;
end;
writeln('YES');
end.
poj3678的更多相关文章
- hdu 4421 和poj3678类似二级制操作(2-sat问题)
/* 题意:还是二进制异或,和poj3678类似 建边和poj3678一样 */ #include<stdio.h> #include<string.h> #include&l ...
- poj3678 Katu Puzzle 2-SAT
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6714 Accepted: 2472 Descr ...
- 2-sat(and,or,xor)poj3678
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7949 Accepted: 2914 Descr ...
- POJ-3678 Katu Puzzle 2sat
题目链接:http://poj.org/problem?id=3678 分别对and,or,xor推出相对应的逻辑关系: 逻辑关系 1 0 A and B A'->A,B'->B ...
- POJ3678【错误总会让自己有收获的】
首先我是的确确定了LRJ那个代码也是判断一个点的两种状态是否在一个连通分量内. 关于自己做的,自己又确定了一些,让自己那样先,比如说对于 3 6 1 AND这样3 6都已经确定的点,自己用 ...
- poj3678(two-sat)
传送门:Katu Puzzl 题意:n个点,点的取值可以是0或者1.m条边,有权值,有运算方式(并,或,异或),要求和这条边相连的两个点经过边上的运算后的结果是边的权值.问你有没有可能把每个点赋值满足 ...
- Poj3678:Katu Puzzle
大概题意 有\(n\)个数,可以为\(0/1\),给\(m\)个条件,表示某两个数经过\(or, and, xor\)后的数是多少 判断是否有解 Sol \(2-SAT\)判定 建图 # includ ...
- POJ3678 Katu Puzzle
原题链接 \(2-SAT\)模板题. 将\(AND,OR,XOR\)转换成\(2-SAT\)的命题形式连边,用\(tarjan\)求强连通分量并检验即可. #include<cstdio> ...
- POJ3678:Katu Puzzle——题解
http://poj.org/problem?id=3678 总觉得这题比例题简单. 设a为x取0的点,a+n为x取1的点. 我们还是定义a到b表示取a必须取b. 那么我们有: 当AND: 1.当c= ...
随机推荐
- async:false同步请求,浏览器假死
// 异步请求导致数据错乱 // function get_num(){ // $("input[name='monitor']").eq(1).attr('checked',tr ...
- wamp下开启SSL,解决APACHE启动问题
wamp开启SSL解决wamp5_1.7.4中APACHE启动问题 1.#修改httpd.conf文件LoadModule ssl_module modules/mod_ssl.soInclude c ...
- 不同的extend 在调用构造函数时不同的写法
/** * jQuery.hhNewSilder 滚动图片插件 * User: huanhuan * QQ: 651471385 * Email: th.wanghuan@gmail.com ...
- JS 获取 路径参数 传入 参数名 截取 & 和 # 之前 字符
function getQueryStringByName(name) { var result = location.search.match(new RegExp("[\?\&] ...
- 51nod1174区间中最大的数
1174 区间中最大的数基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中, ...
- 安装Android Studio报failed to find java version for 'C:\windows\system32\java.exe':[2] The system cannot find the specified file.错误的解决方案
方案很简单,找到SYSTEM32目录下的java.exe文件,重命名为java.exe.orj. 方案出处:http://stackoverflow.com/questions/10339679/an ...
- Oracle表空间传输测试
源数据库平台:window 7 64bit Oracle 11g 64bit目标数据库平台:RHEL6 64bit Oracle 11g 64bit 1.查看数据集 select * from nls ...
- 聊天工具实现winform端实现
最近在找能够实现客户端点对点聊天的技术,通过github我发现了一个项目,它能够支持webscoket通讯,服务端是由c#socket完成. 我要的是winform端的通信,所以在他的基础上,增加了桌 ...
- 一名IT从业者的英语口语能力成长路径
一名IT从业者的英语口语能力成长路径 来源: 微信公众号 发布时间: 2014-03-12 22:53 阅读: 6134 次 推荐: 24 原文链接 [收藏] 这篇文章是我最近十天口 ...
- 【Druid】 阿里巴巴推出的国产数据库连接池com.alibaba.druid.pool.DruidDataSource
阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好 简单使用介绍 Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息 ...