poj 3678 Katu Puzzle 2-SAT

题目大意

  给定n个布尔型变量,以及m个限制,限制有三种类型,AND,OR,XOR。分别表示两个变量进行这些运算的值。每个变量只能取0或1.问是否有一种情况满足所有条件的限制

 

分析

  对于本题,设i表示该变量为false,i’表示该变量为true。

  i and j=1-------------->add(i,i')   add(j,j')

  i and j=0-------------->add(i',j)  add(j',i)

  i or j=1---------------->add(i,j')   add(j,i')

  i or j=0---------------->add(i',i)   add(j',j)

  i xor j=1--------------->add(i',j)   add(j',i) add(i,j') add(j,i')

  i xor j=0---------------> add(i,j)   add(i',j') add(j,i)  add(j',i')

  连一条边i->j表示若选i则必选j。

  根据2—Sat然后求一次强联通分量,若有i、i'在同一强联通分量内则无满足条件,反之则有。

 

代码

  

type
  arr=record
    x,y,next:longint;
end;

var
  a:array[1..5000000] of arr;
  f:array[1..3000] of boolean;
  ls,zan,g:array[1..3000] of longint;
  dfn,low:array[1..3000] of longint;
  tot,sum,n,m:longint;
  i,j,k:longint;
  e,d:longint;
  x,y,z:longint;
  c:char;

procedure add(x,y:longint);
begin
  inc(e);
  a[e].x:=x;
  a[e].y:=y;
  a[e].next:=ls[x];
  ls[x]:=e;
end;

function min(x,y:longint):longint;
begin
  if x<y then exit(x)
         else exit(y);
end;

procedure dfs(x:longint);
var
  i:longint;
begin
  inc(d);
  dfn[x]:=d;
  low[x]:=d;
  inc(tot);
  zan[tot]:=x;
  f[x]:=true;
  i:=ls[x];
  while i>0 do
    with a[i] do
    begin
      if dfn[y]=0
        then begin
               dfs(y);
               low[x]:=min(low[x],low[y]);
             end
        else if f[y] then low[x]:=min(low[x],dfn[y]);
      i:=next;
    end;
  if low[x]=dfn[x] then
  begin
    inc(sum);
    repeat
      i:=zan[tot];
      dec(tot);
      f[i]:=false;
      g[i]:=sum;
    until i=x;
  end;
end;

procedure tarjan;
var
  i:longint;
begin
  fillchar(f,sizeof(f),0);
  for i:=1 to n*2 do
    if dfn[i]=0
      then
        dfs(i);
end;

procedure work;
var
  i:longint;
begin
  for i:=1 to n do
    if g[i]=g[i+n] then
    begin
      writeln('NO');
      exit;
    end;
  writeln('YES');
end;

begin
  readln(n,m);
  for i:=1 to m do
    begin
      read(x,y,z);
      inc(x); inc(y);
      read(c);
      while c=' ' do
        read(c);
      readln;
      if c='A' then
        if z=1
          then
            begin
              add(x,x+n);
              add(y,y+n);
            end
          else
            begin
              add(x+n,y);
              add(y+n,x);
            end;
      if c='O' then
        if z=1
          then
            begin
              add(x,y+n);
              add(y,x+n);
            end
          else
            begin
              add(x+n,x);
              add(y+n,y);
            end;
      if c='X' then
        if z=1
          then
            begin
              add(x,y+n);
              add(x+n,y);
              add(y,x+n);
              add(y+n,x);
            end
          else
            begin
              add(x,y);
              add(x+n,y+n);
              add(y,x);
              add(y+n,x+n);
            end;
    end;
  tarjan;
  work;
end.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值