1305: [CQOI2009]dance跳舞

题目:传送门

题解:

   一眼网络流基础建模...然后就GG了

   二分答案+拆点建边+最大流判断:
   把男女生拆为男1,男2,女1,女2

   1、男1和男2还有女1和女2之间连边,流量为约束条件k

   2、st连男1,女2连ed,流量为二分的mid

   3、如果男生i喜欢女生j,就将男1与女2相连(不在约束条件内)

   4、如果不喜欢,就将男2与女1相连(在约束条件内)

代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char ss[][];
struct node
{
int x,y,c,next,other;
}a[];int len,last[];
int st,ed,head,tail,n,k;
void ins(int x,int y,int c)
{
int k1,k2;
k1=++len;
a[len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len; k2=++len;
a[len].x=y;a[len].y=x;a[len].c=;
a[len].next=last[y];last[y]=len; a[k1].other=k2;
a[k2].other=k1;
}
int h[],list[];
bool bt_h()
{
memset(h,,sizeof(h));h[st]=;
head=;tail=;list[]=st;
while(head!=tail)
{
int x=list[head];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]== && a[k].c)
{
h[y]=h[x]+;
list[tail++]=y;
}
}
head++;
}
if(h[ed])return true;
return false;
}
int find_flow(int x,int flow)
{
if(x==ed)return flow;
int t,s=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]==(h[x]+) && a[k].c && s<flow)
{
s+=t=find_flow(y,min(a[k].c,flow-s));
a[k].c-=t;a[a[k].other].c+=t;
}
}
if(s==)h[x]=;
return s;
}
int mid,l,r;
int s1[],s2[];
void build(int cc)
{
len=;memset(last,,sizeof(last));
st=*n+;ed=st+;
for(int i=;i<=n;i++)ins(st,i,cc);
for(int i=;i<=n;i++)ins(i+n*,ed,cc);
for(int i=;i<=n;i++)ins(i,i+*n,k);
for(int i=;i<=n;i++)ins(i+n,i+n*,k);
/*for(int i=1;i<=n;i++)
{
ins(st,i,cc);
ins(i,i+n*2,s1[i]+k);//男1-->男2
}
for(int j=1;j<=n;j++)
{
ins(j+n*3,ed,cc);
ins(j+n,j+n*3,s2[j]+k);//女1-->女2
}*/
for(int i=;i<=n;i++)//男2-->女1
for(int j=;j<=n;j++)
{
if(ss[i][j]=='Y')ins(i,j+n*,);
else ins(i+n*,j+n,);
}
}
bool check(int cnt)
{
build(cnt);
int ans=;
while(bt_h())
ans+=find_flow(st,);
if(ans==n*cnt)return true;
return false;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%s",ss[i]+);
l=;r=n;int sum=;
while(l<=r)
{
mid=(l+r)/;
if(check(mid))
{
l=mid+;
sum=mid;
}
else r=mid-;
}
printf("%d\n",sum);
return ;
}

bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)的更多相关文章

  1. BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流

    题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...

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

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

  3. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

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

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

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

  5. Bzoj1305 [CQOI2009]dance跳舞

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

  6. 【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞

    http://hzwer.com/1986.html #include<cstdio> #include<algorithm> #include<queue> #i ...

  7. 并不对劲的bzoj1305: [CQOI2009]dance跳舞

    传送门-> 又是陈年老坑. 听上去不知道从何下[手]?那要是把题目换成“判断这些人能否条x支舞”呢? 这样就变成了一个网络流可以解决的问题,只要把每个人拆成喜欢和不喜欢两点,每个人两点总流量不超 ...

  8. [CQOI2009]dance跳舞(最大流+二分)

    [CQOI2009]dance跳舞 每个人拆成$2$个点,表示是否与喜欢的人跳舞 跳$m$首舞曲时,满足最大流为$n*m$ 二分$m$,跑最大流即可 #include<cstdio> #i ...

  9. BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )

    云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...

随机推荐

  1. 本地配置 Redis

    1.下载 https://redis.io/ https://github.com/dmajkic/Redis/downloads 2. 2.cmd 运行: 3.切换到另外一个cmd : ok! 关于 ...

  2. #定位系统性能瓶颈# perf

    perf是一个基于Linux 2.6+的调优工具,在liunx性能測量抽象出一套适应于各种不同CPU硬件的通用測量方法,其数据来源于比較新的linux内核提供的 perf_event 接口 系统事件: ...

  3. linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

    linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库   创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查 ...

  4. angular4父组件向子组件传值,子组件向父组件传值的方法

    父组件向子组件传值   @Input 文件目录 父组件: father.template.html <h1>父组件</h1> <cmt-child [data]='dat ...

  5. tableview偏移

    tableview偏移 方法一:改变edgesForExtendedLayout self.edgesForExtendedLayout = UIRectEdgeNone; 将edgesForExte ...

  6. eclipse搭建android开发环境

    1.首先安装JDK 此步骤是做JAVA必经之路,不多累述,强调要注意的地方: 目前为止android的开发环境只支持JDK1.7,千万不要下载JDK1.8. 下载的JDK一定要选择好操作系统,特别是要 ...

  7. SQLiteHelp

    using System; using System.Collections.Generic; using System.Text; using System.Data.SQLite; using S ...

  8. c/s winform打包和部署

    1:vs2010新建  安装项目  左边出现3个文件夹 2:点击 第一个文件夹-> “应用程序文件夹”    将 bin 目录下的所以文件  拖进 右边的空白处:c:\windows\syste ...

  9. 洛谷P4015 运输问题(费用流)

    题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai​ 个单位的货物:第 jj 个零售商店需要 b_jbj​ 个单位的货物. 货物供需平衡,即\sum\limits ...

  10. .NET Datatable常用系列一

    Datatable常用系列一 一.用作集合存储数据: DataTable dt = new DataTable("action"); for (int i = 0; i < ...