把每对钥匙看做一个变量,那两个钥匙看做他的两个状态

每一个开门的要求就是一个条件(xi or xj)

很显然有了2sat的基本要素

2sat是一个判定性问题,而这题求最多能过几个门;

不难想到二分答案,转化为判定性问题可轻松解决

 type node=record
       next,point:longint;
     end;
var edge:array[..] of node;
    v,f:array[..] of boolean;
    other,d1,d2,be,dfn,low,p,st:array[..] of longint;
    mid,l,r,n,m,x,y,ans,len,sum,t,h,i:longint; 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);
    inc(t);
    st[t]:=x;
    dfn[x]:=h;
    low[x]:=h;
    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 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; function check(k:longint):boolean;
  var i,x,y:longint;
  begin
    len:=;
    fillchar(p,sizeof(p),);
    fillchar(v,sizeof(v),false);
    fillchar(f,sizeof(f),false);
    fillchar(st,sizeof(st),);
    fillchar(be,sizeof(be),);
    sum:=;
    for i:= to k do
    begin
      x:=d1[i];
      y:=d2[i];
      add(other[x],y);
      add(other[y],x);
    end;
    for i:= to *n- do
      if not v[i] then
      begin
        t:=;
        h:=;
        tarjan(i);
      end;

    for i:= to *n- do
      if be[other[i]]=be[i] then exit(false);
    exit(true);
  end; begin
  readln(n,m);
  while (n<>) and (m<>) do
  begin
    len:=;
    fillchar(p,sizeof(p),);
    for i:= to n do
    begin
      readln(x,y);
      other[x]:=y;
      other[y]:=x;
    end;
    for i:= to m do
      readln(d1[i],d2[i]);
    ans:=;
    l:=;
    r:=m;
    while l<=r do
    begin
      mid:=(l+r) shr ;
      if check(mid) then
      begin
        ans:=mid;
        l:=mid+;
      end
      else r:=mid-;
    end;
    writeln(ans);
    readln(n,m);
  end;
end.

poj2723的更多相关文章

  1. hdu3715 Go Deeper[二分+2-SAT]/poj2723 Get Luffy Out[二分+2-SAT]

    这题转化一下题意就是给一堆形如$a_i + a_j \ne c\quad (a_i\in [0,1],c\in [0,2])$的限制,问从开头开始最多到哪条限制全是有解的. 那么,首先有可二分性,所以 ...

  2. 【POJ2723】Get Luffy Out - 二分+2-SAT

    题面描述 Ratish is a young man who always dreams of being a hero. One day his friend Luffy was caught by ...

  3. Poj2723:Get Luffy Out

    题意 给出 n 对钥匙,每对只能挑一把使用,每把只能用一次,当一对钥匙中的一把被使用后,另一把也就不能再用了:然后给出 m 道门,每个门都有两把钥匙可以打开,问最多能开几道门(按给出的顺序开). So ...

  4. poj2723 2-sat

    当两个门锁相同时,这个钥匙必须用,不同时分开用 可以直接遍历门,当然二分更快 #include<map> #include<set> #include<cmath> ...

  5. POJ2723 Get Luffy Out 【2-sat】

    题目 Ratish is a young man who always dreams of being a hero. One day his friend Luffy was caught by P ...

  6. poj2723 2sat判断解+二分

    典型的2-sat问题,题意:有m个门,每个门上俩把锁,开启其中一把即可,现在给n对钥匙(所有 钥匙编号0123456...2n-1),每对钥匙只能用一把,要求尽可能开门多(按顺序,前max个). 关键 ...

  7. POJ2723 Get Luffy Out解题报告tarjan+2-SAT+二分

    今天看到讲2-SAT比较好的blog,感觉微微的理解了2-SAT 传送门 参考: https://blog.csdn.net/leolin_/article/details/6680144 题意:你有 ...

  8. POJ2723 题解

    WA了半天才发现居然是因为没看见这道题有多组数据,wzfl... 题目大意:有N对钥匙,对于每一对钥匙,如果使用了其中一把,另一把钥匙就会消失.接下来有M扇门,每扇门上有两把锁,分别对应两把钥匙(锁会 ...

  9. ACM训练计划step 2 [非原创]

    (Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...

随机推荐

  1. JSP九大内置对象(转载)

    JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1. ...

  2. [转]怎样在cmd(命令提示符)下进行复制粘贴操作

    原文链接:http://jingyan.baidu.com/article/93f9803fd3a4dde0e46f55f5.html cmd下复制粘贴的快捷操作方式 工具/原料 系统cmd 步骤/方 ...

  3. sgu 105 Div 3

    一个数能整除3当且仅当各位数之和能整除3. 有了这个规律就好办了, 但是呢,仔细一看, n太大了, 都到 2^31 了.所以简单的模拟肯定不行. 这种貌似像数论的题,一时找不到好办法,就打表! 打表出 ...

  4. 解决Ubuntu和Windows的文件乱码问题(转载)

    解决Ubuntu和Windows的文件乱码问题(debian也通用) 1.转换文件内容编码   Windows下天生的纯文本文件,其中文编码为GBK,在Ubuntu下显示为乱码,可以使用iconv命令 ...

  5. HDOJ(1001) Sum Problem

    这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题: 四则运算符(+.-.*./)和求余运算符(%)结合性都是从左到右. 于是,我自己写了一个版本,主要是考虑( ...

  6. mysql---整体备份和增量备份

    整体备份: 对整张表或者整个数据库甚至所有数据库进行备份. 增量备份: 对某一范围内的数据进行备份. 1.整体备份: 对表进行备份: 针对存储引擎为myisam的表,可以直接复制frm.myd.myi ...

  7. mysql---左连接、右连接、内连接之间的区别与联系

    现有两张表 第一张表为男生表,记录了男生的姓名和配偶的编号 第二张表为女生表,记录了女生的姓名和自己的编号 第一种情况:主持人请所有男生都上台,并且带上自己的配偶.这时不管男生有没有配偶都要上台,所以 ...

  8. 对Android中dp单位的理解

    dp 设备独立像素 ,也叫dip, device independent pixle. 比如同样在1英寸大小的屏幕上,高密度的屏幕可显示100个像素点,而低密度的屏幕只能70个点. 用了dp之后,只要 ...

  9. Sybase数据库异常紧急恢复

    现象:Error 926  Severity Level 14  Error Message Text  Database 'xx' cannot be opened - it has been ma ...

  10. java学习:用反射构造bean

    先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...