题目大意:有n个女生,n个男生,每次一男一女跳舞。同一队只会跳一次。每个男孩最多只愿意和k个不喜欢的女孩跳舞,女孩同理。问舞会最多能有几首舞曲?

题解:二分跳了多少次舞,每次重建图,建超级原点和汇点,每个人拆点成喜欢和不喜欢两个点,之间连边,容量为mid。最后看流量与预计流量是否相同

卡点:1.超级原点和汇点与每个点的边的容量定为mid(应为k)

C++ Code:

#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int n,k,mid,ans;
int d[250];
int q[250],h,t;
int start=1,end;
int head[250],cnt=2;
char ch[60];
struct Edge{
int to,nxt,cost;
}e[1000000];
int v[60][60];
inline int min(int a,int b){return a<b?a:b;}
void add(int a,int b,int c){
e[cnt]=(Edge){b,head[a],c};head[a]=cnt;
e[cnt^1]=(Edge){a,head[b],0};head[b]=cnt^1;
cnt+=2;
}
bool bfs(){
memset(d,0,sizeof d);
d[q[t=h=1]=start]=1;
while (h<=t){
int x=q[h++];
if (x==end)return true;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if (e[i].cost&&!d[to]){
d[to]=d[x]+1;
q[++t]=to;
}
}
}
return d[end];
}
int dfs(int x,int low){
if (x==end||!low)return low;
int res=0,w;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if (e[i].cost&&(d[x]==d[to]-1)){
w=dfs(to,min(e[i].cost,low-res));
e[i].cost-=w;
e[i^1].cost+=w;
res+=w;
if (res==low)return low;
}
}
if (!res)d[x]=-1;
return res;
}
void build(int mid){
memset(head,0,sizeof head);
cnt=2;
for(int i=1;i<=n;i++){
add(start,i+1,mid);
add(i+n+n+1,end,mid);
add(i+1,i+n+1,k);
add(i+n+n+n+1,i+n+n+1,k);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(v[i][j])add(i+1,j+n+n+1,1);
else add(i+n+1,j+n+n+n+1,1);
}
bool check(int mid){
build(mid);
// puts("la");
int ans=0,k;
while (bfs()){
k=dfs(start,inf);
if (k>0)ans+=k;
}
if (ans==mid*n)return true;
return false;
}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%s",ch);
for (int j=1;j<=n;j++){
v[i][j]=(ch[j-1]=='Y');
}
}
end=(n<<2)+2;
// puts("lalal");
int l=0,r=n;
while (l<=r){
mid=l+r>>1;
if (check(mid))l=mid+1,ans=mid;
else r=mid-1;
// printf("%d\n",mid);
}
printf("%d\n",ans);
return 0;
}

  

最新文章

  1. JavaScript dom 标签属性
  2. static和public的区别
  3. php配置中的register_globals用法
  4. CF 2B.The least round way
  5. json 转换错误:JSON.parse expected property name or &#39;}&#39;
  6. mysql服务器io等待高定位与分析
  7. Pascal's Triangle II
  8. Maven基础教程
  9. 通过Servlet实现汉字验证码
  10. 张高兴的 Windows 10 IoT 开发笔记:使用 ADS1115 读取模拟信号
  11. 201521044091 java 第十周学习总结
  12. 【转帖】系统软件工程师必备技能-进程内存的working set size(WSS)测量
  13. 安装软件出现缺少vcruntime140.dll
  14. sql 多行转多列,多行转一列合并数据,列转行
  15. css高级选择器&amp;盒模型
  16. BZOJ1022[SHOI2008]小约翰的游戏——anti-SG(反尼姆博弈)
  17. 视觉显著性检测(Visual saliency detection)相关概念
  18. [转]Hive开发经验问答式总结
  19. vue核心之虚拟DOM
  20. Flask-SQLAlchemy插件

热门文章

  1. nginx2goaccess.sh脚本内容
  2. webBrowser 应用编程函数总结
  3. Delphi 过程类型
  4. Scrapy之Cookie和代理
  5. 某CTF收集的Mysql爆表、爆字段语句
  6. c#vs连接SQL sever数据库入门操作
  7. ISE中FPGA的实现流程
  8. python爬取数据需要注意的问题
  9. jsp 路径问题和环境路径以及各种路径总结
  10. 修改npm全局安装模式的路径