第一道2sat,

其实2sat问题不难,只要记住一个:通过“推导出”连边

什么意思呢?就是一般题目中的变量都有两个状态,只能取一个,我们定义为true和false

对于每一个变量i,我们都拆成两个点,分别表示两种状态,设2i表示true,2i+1表示false。

然后来看每个条件,比如要满足xi=true or xj=true成立

显然,当xj=false,我们必然能推出xi=true,所以我们就连2j+1--->2i

同样的xi=false是,我们必然能推出xj=true,所以我们连2i+1--->2j

根据出这样的推导出关系我们就可以构建出一个图

如果能满足所有的条件,必然从任意变量的一个状态走,必定不能走到这个变量的对立状态

所以我们只要tarjan一下,判断任意2i,2i+1是否在一个强联通分量中,如果不存在,就说明能满足所有条件

这道题题目叙述很烦,只要掌握了基本的2sat问题,耐心分析一下是很容易做出的

 type node=record
       point,next:longint;
     end; var st,dfn,low,be,w:array[..] of longint;
    edge:array[..] of node;
    v,f:array[..] of boolean;
    tot,l,j,len,x,y,i,h,t,n,m,sum:longint;
    f1,p,f2,flag:boolean;
    s:string; function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; function get(x,y:longint):longint;
  var i:longint;
  begin
    if s[x]='m' then p:=false else p:=true;
    get:=;
    for i:=x+ to y do
    begin
      if s[i]=' ' then break;
      get:=get*+ord(s[i])-;
    end;
  end; procedure add(x,y:longint);
  begin
    inc(len);
    edge[len].point:=y;
    edge[len].next:=w[x];
    w[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:=w[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 low[x]=dfn[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
  readln(tot);
  while tot> do
  begin
    readln(n,m);
    len:=;
    fillchar(w,sizeof(w),);
    for i:= to m do
    begin
      readln(s);
      l:=length(s);
      for j:= to l do
        if s[j]=' ' then break;
      x:=get(,j-);
      f1:=p;
      y:=get(j+,l);
      f2:=p;
      if f1 and f2 then
      begin
        add(x+n,y);
        add(y+n,x);
      end
      else if not f1 and not f2 then
      begin
        add(x,y+n);
        add(y,x+n);
      end
      else if not f1 and f2 then
      begin
        add(x,y);
        add(y+n,x+n);
      end
      else if f1 and not f2 then
      begin
        add(x+n,y+n);
        add(y,x);
      end;
    end;
    fillchar(v,sizeof(v),false);
    fillchar(f,sizeof(f),false);
    fillchar(st,sizeof(st),);
    fillchar(be,sizeof(be),);
    sum:=;
    for i:= to *n do
      if not v[i] then
      begin
        h:=;
        t:=;
        tarjan(i);
      end;     flag:=true;
    for i:= to n do
      if be[i]=be[i+n] then
      begin
        flag:=false;
        break;
      end;     if flag then writeln('GOOD') else writeln('BAD');
    dec(tot);
  end;
end.

bzoj1823的更多相关文章

  1. BZOJ1823 [JSOI2010]满汉全席 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8125944.html 题目传送门 - BZOJ1823 题意概括 有n道菜,分别可以做成满式和汉式(每道菜只能做 ...

  2. 【BZOJ1823】[JSOI2010]满汉全席(2-sat)

    [BZOJ1823][JSOI2010]满汉全席(2-sat) 题面 BZOJ 洛谷 题解 很明显的\(2-sat\)模板题,还不需要输出方案. 对于任意两组限制之间,检查有无同一种石材要用两种不同的 ...

  3. 【BZOJ1823】[JSOI2010]满汉全席 2-SAT

    [BZOJ1823][JSOI2010]满汉全席 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只 ...

  4. LG4171/BZOJ1823 「JSOI2010」满汉全席 2-SAT

    问题描述 LG4171 BZOJ1823 题解 显然,每个评委对每个材料的满式/汉式要求是对\(n\)个元素的\(0,1\)取值限制. 显然想到\(\mathrm{2-SAT}\) 于是就可以切掉了. ...

  5. Bzoj1823 [JSOI2010]满汉全席

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1640  Solved: 798 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的 ...

  6. C++之路进阶——bzoj1823(满汉全席)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...

  7. 【BZOJ1823】 [JSOI2010]满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...

  8. bzoj1823 [JSOI2010]满汉全席(2-SAT)

    1823: [JSOI2010]满汉全席 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1246  Solved: 598[Submit][Status ...

  9. BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点

    题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过 ...

随机推荐

  1. ajax跨域请求的解决方案

    一直打算改造一下自己传统做网站的形式. 我是.Net程序员,含辛茹苦数年也没混出个什么名堂. 最近微信比较火, 由于现在大环境的影响和以前工作的总结和经验,我打算自己写一个数据,UI松耦合的比较新潮的 ...

  2. CruiseControl.NET : Configuration Preprocessor

    Original link: http://build.sharpdevelop.net/ccnet/doc/CCNET/Configuration%20Preprocessor.html http: ...

  3. OpenJudge/Poj 2027 No Brainer

    1.链接地址: http://bailian.openjudge.cn/practice/2027 http://poj.org/problem?id=2027 2.题目: 总Time Limit: ...

  4. MyBatis入门教程(基于Mybatis3.2)

    MyBatis和Hibernate一样都是基于ORM的关系型数据库框架 ORM工具的基本思想: 1.从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfa ...

  5. Android中的EditText默认时不弹出软键盘的方法

    方法一: 在 AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为 adjustUnspecified|stateHidden <a ...

  6. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)

    jar包完成后,剩下就是要构建ANE包来供实际程序调用. 首先要建两个Flex库项目, default那个是官方建议加上的,仅用于不在真实环境下编译调试的时候有个默认接口不至于调用不成功报错,项目结构 ...

  7. wifidog编译到openwrt

    首先敲一下 cd 命令,定位到自己的用户目录, 然后 mkdir openwrt 新建一个openwrt文件夹,然后开始装openwrt的编译用到的工具, sudo apt-get install g ...

  8. parseInt()、parseFloat()与Number()的比较

    我有一个同学最近在自学JavaScript,偶尔遇到问题了会让我帮忙解决,虽然我也是一个JavaScript菜鸟,但是我还是很乐意帮忙,这样不仅可以帮到别人,也可以让自己在解决问题的过程中学到更多知识 ...

  9. ajax、json一些整理(1)

    1.请求text数据,在success事件中手动解析 前台:                 $.ajax({                     type: "post", ...

  10. C#多线程(一)

    一.定义与理解 1.定义 线程是操作系统分配CPU时间片的基本单位,每个运行的引用程序为一个进程,这个进程可以包含一个或多个线程. 线程是进程中的执行流程,每个线程可以得到一小段程序的执行时间,在单核 ...