让我们继续来练网络流;

很明显是一个最大流的问题;

二分枚举最多次数m,然后最大流判定;

具体就是男生女生都拆成两个点i1,i2,之间连一条流量为k的边(男生i1-->i2,女生i2-->i1);

i2连不喜欢的人,i1连喜欢的人

最后,男生i1连源点流量为m,女生i1连汇点流量为m

最后判断最大流是否等于n*m即可

但做着做着,我发现好像好像二分+最大流不是很优,因为进行了很多重复操作

但我也没管,先A了再说;

后来看status发现很多人代码很短,用时0ms(我的最大流180ms)

肯定有更简单的方法:

贪心!……其实是错的……

 code(using maxflow):
type node=record
       next,point,flow:longint;
     end; var edge:array[..] of node;
    a:array[..,..] of boolean;
    cur,pre,p,numh,h:array[..] of longint;
    j,m,n,k,i,len,t,ans,l,r:longint;
    c:string; function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; procedure add(x,y,f:longint);
  begin
    inc(len);
    edge[len].flow:=f;
    edge[len].point:=y;
    edge[len].next:=p[x];
    p[x]:=len;
  end; function sap(m:longint):boolean;
  var s,u,tmp,i,j,q:longint;
  begin
    len:=-;
    fillchar(p,sizeof(p),);
    for i:= to n do
    begin
      add(,i,m);
      add(i,,m);
      add(i+*n,t,m);
      add(t,i+*n,);
      add(i,i+n,k);
      add(i+n,i,);
      add(i+*n,i+*n,k);
      add(i+*n,i+*n,);
    end;
    for i:= to n do
      for j:= to n do
        if a[i,j] then
        begin
          add(i,j+*n,);
          add(j+*n,i,);
        end
        else begin
          add(i+n,j+*n,);
          add(j+*n,i+n,);
        end;
    fillchar(numh,sizeof(numh),);
    fillchar(h,sizeof(h),);
    numh[]:=t+;
    u:=;
    s:=;
    while h[]<t+ do
    begin
      if u=t then
      begin
        i:=;
        while i<>t do
        begin
          j:=cur[i];
          dec(edge[j].flow);
          inc(edge[j xor ].flow);
          i:=edge[j].point;
        end;
        u:=;
        inc(s);
        if s=n*m then exit(true);
      end;
      q:=-;
      i:=p[u];
      while i<>- do
      begin
        j:=edge[i].point;
        if (edge[i].flow>) and (h[u]=h[j]+) then
        begin
          q:=i;
          break;
        end;
        i:=edge[i].next;
      end;
      if q<>- then
      begin
        cur[u]:=q;
        pre[j]:=u;
        u:=j;
      end
      else begin
        dec(numh[h[u]]);
        if numh[h[u]]= then exit(false);
        tmp:=t+;
        i:=p[u];
        while i<>- do
        begin
          j:=edge[i].point;
          if edge[i].flow> then tmp:=min(tmp,h[j]);
          i:=edge[i].next;
        end;
        h[u]:=tmp+;
        inc(numh[h[u]]);
        if u<> then u:=pre[u];
      end;
    end;
    exit(false);
  end; begin
  readln(n,k);
  for i:= to n do
  begin
    readln(c);
    for j:= to n do
    begin
      if c[j]='Y' then a[i,j]:=true
      else a[i,j]:=false;
    end;
  end;
  t:=n*+;
  l:=;
  r:=n;
  ans:=;
  while l<=r do
  begin
    m:=(l+r) shr ;
    if sap(m) then
    begin
      ans:=m;
      l:=m+;
    end
    else r:=m-;
  end;
  writeln(ans);
end.

bzoj1305的更多相关文章

  1. 【BZOJ1305】跳舞(网络流)

    [BZOJ1305]跳舞(网络流) 题面 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一 ...

  2. [BZOJ1305][CQOI2009]跳舞(网络流)

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3944  Solved: 1692[Submit][St ...

  3. 【BZOJ1305】dance跳舞(最大流,裂点,二分答案)

    题意:一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. 有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”). ...

  4. Bzoj1305 [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2925  Solved: 1221 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时 ...

  5. BZOJ-1305 dance跳舞 建图+最大流+二分判定

    跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...

  6. 【BZOJ1305】 [CQOI2009]dance跳舞

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  7. 【BZOJ1305】【CQOI2009】 dance跳舞

    看menci的博客点出二分的思路然后做出来,menci太强辣 原题: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. ...

  8. bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞

    http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 ...

  9. BZOJ1305 [CQOI2009]dance跳舞 【网络流】

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 3714  Solved: 1572 [Submit][ ...

随机推荐

  1. Windows平台下为Python添加MySQL支持

    到Python官网下载MySQL-python-1.2.5.win32-py2.7.exe 安装MySQL-python-1.2.5.win32-py2.7 附 64位MySQL-python下载地址 ...

  2. Python的文件与文件夹操作

    Python的文件与文件夹操作 Python OS模块 1.重命名:os.rename(old, new) 2.删除:os.remove(file) 3.列出目录下的文件 :os.listdir(pa ...

  3. Python试卷

    3.写一个函数,计算一个给定的日期是该年的第几天. def getday(self,y=None,m=None,d=None): date = datetime(y,m,d) days = date. ...

  4. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  5. JS 判断一个字符串是否包含在一个数组中

    var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...

  6. 十九、mysql 数据分布式

    1.RAID 廉价磁盘冗余阵列 2.Symbolic links 通俗易懂的说就是通过连接符指向的操作,人为的将某些数据库分布到其他的文件夹/磁盘上 Linux: Mysql DATA路径:/opt/ ...

  7. Eclipse中设置作者日期等信息

    在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse 中进行设置自己希望显示的信息. 现在看看如何修改 ...

  8. Qt单元测试

    单元测试之作用要完成测试用例,保证设计上的耦合依赖通过测试用例,保证覆盖率,提高程序质量 QTest一些有用的静态函数QTest::qExecQTest::qSleepQTest::qWait   例 ...

  9. DB天气 Alpha版使用说明

    一 产品介绍 DB天气是一款能够准确预报天气的软件,它的特点在于它的简洁的设计风格,以及贴心的预报方式.是一款非主流的小清新的天气APP. 二 功能介绍 下面介绍一下DB天气的主界面以及天气功能的实现 ...

  10. 分析Hibernate的事务处理机制

    Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的 Transaction实际上是底层的JDBC Transactio ...