题目给的太裸,显然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的更多相关文章

  1. hdu 4421 和poj3678类似二级制操作(2-sat问题)

    /* 题意:还是二进制异或,和poj3678类似 建边和poj3678一样 */ #include<stdio.h> #include<string.h> #include&l ...

  2. poj3678 Katu Puzzle 2-SAT

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6714   Accepted: 2472 Descr ...

  3. 2-sat(and,or,xor)poj3678

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7949   Accepted: 2914 Descr ...

  4. POJ-3678 Katu Puzzle 2sat

    题目链接:http://poj.org/problem?id=3678 分别对and,or,xor推出相对应的逻辑关系: 逻辑关系 1 0  A and B     A'->A,B'->B ...

  5. POJ3678【错误总会让自己有收获的】

       首先我是的确确定了LRJ那个代码也是判断一个点的两种状态是否在一个连通分量内.    关于自己做的,自己又确定了一些,让自己那样先,比如说对于 3 6 1 AND这样3 6都已经确定的点,自己用 ...

  6. poj3678(two-sat)

    传送门:Katu Puzzl 题意:n个点,点的取值可以是0或者1.m条边,有权值,有运算方式(并,或,异或),要求和这条边相连的两个点经过边上的运算后的结果是边的权值.问你有没有可能把每个点赋值满足 ...

  7. Poj3678:Katu Puzzle

    大概题意 有\(n\)个数,可以为\(0/1\),给\(m\)个条件,表示某两个数经过\(or, and, xor\)后的数是多少 判断是否有解 Sol \(2-SAT\)判定 建图 # includ ...

  8. POJ3678 Katu Puzzle

    原题链接 \(2-SAT\)模板题. 将\(AND,OR,XOR\)转换成\(2-SAT\)的命题形式连边,用\(tarjan\)求强连通分量并检验即可. #include<cstdio> ...

  9. POJ3678:Katu Puzzle——题解

    http://poj.org/problem?id=3678 总觉得这题比例题简单. 设a为x取0的点,a+n为x取1的点. 我们还是定义a到b表示取a必须取b. 那么我们有: 当AND: 1.当c= ...

随机推荐

  1. jquery checkbox 选中 全选 插件

    checkbox  选中 全选 在项目中经常用到,但是不同的程序员写出的东西各有差异,在此整合了jquery checkbox插件,用起来很方便,也总结了我们项目中通常会出现问题的地方,一行代码搞定. ...

  2. YII2框架动态创建表模型

    YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...

  3. PHP生成压缩文件开发实例

    大概需求: 每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载 细节需求:当前订单号_年月日+时间.zip  例如: 1.生成压缩文件,压缩文件名格式: 2.压缩文件 ...

  4. CSS中Padding的用法

    Padding的英文意思是填充,在CSS中则是设置内边距属性. padding不允许使用负值 1. 四个参数时: padding: 10px,20px,30px,40px; 上边距:10px 右边距: ...

  5. [旧博客]Python 第一次

    决定学习Python,发现其需要安装的东西很小,只需要在官方网站下载和15MB左右的安装包,Python for windows.安装完毕就双击IDE快捷方式就打开IDE了. 你很发现IDE好像很面熟 ...

  6. 微信支付JS API使用心得

    微信的接口真的很坑爹,只返回成功或失败,从来不会告诉你为什么失败.这个微信支付的js接口也是调了一个下午才成功,期间踩了不少坑,在这里总结一下,而且把支付接口封装成了一个js文件,这样以后调用就很方便 ...

  7. Dev-C++之开启装逼效果

    Dev-C++是个不错的C++IDE——在10年前,它是很不错,在现在,它是个以界面丑陋和调试像吃粑粑这两点著称,如下图.

  8. NGUI系列教程四(自定义Atlas,Font)

    今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...

  9. UIExtendedEdge

    在IOS7以后 ViewController 开始使用全屏布局的,而且是默认的行为通常涉及到布局.就离不开这个属性 edgesForExtendedLayout,它是一个类型为UIExtendedEd ...

  10. IDEA的使用

    1.设置字体file->setting->color$fonts->font 保存提示设置file->Settings -> Editor -> General - ...