1305: [CQOI2009]dance跳舞

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 3714  Solved: 1572
[Submit][Status][Discuss]

Description

一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?

Input

第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。

Output

仅一个数,即舞曲数目的最大值。

Sample Input

3 0
YYY
YYY
YYY

Sample Output

3

HINT

N<=50 K<=30

匹配问题,用网络流解决

将每个人拆开成喜欢和不喜欢,分别连边,然后二分向源汇点连边的容量,每次看看是否能满载

具体【我们假设x是喜欢,y是不喜欢,i是男孩,j是女孩】:

①男孩i与女孩j相互喜欢,xi->xj,容量1

②男孩i与女孩j不喜欢,yi->yj,容量1

③xi->yi,容量K

④yj->xj,容量K

二分容量w

⑤S->xi,容量w

⑥xj->T,容量w

每次跑一次最大流看看能够满载即w * N,能说明可以跳至少w次舞

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 605,maxm = 1000005,INF = 1000000000;
inline int RD(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}return out * flag;
}
char s[55][55];
int N,K,S,T,head[maxn],d[maxn],vis[maxn],nedge = 0,cur[maxn];
struct EDGE{int to,f,next;}edge[maxm];
inline void build(int u,int v,int w){edge[nedge] = (EDGE){v,w,head[u]}; head[u] = nedge++;edge[nedge] = (EDGE){u,0,head[v]}; head[v] = nedge++;
}
bool bfs(){memset(vis,0,sizeof(vis));queue<int> q; int u,to;q.push(S); vis[S] = true;while (!q.empty()){u = q.front(); q.pop();Redge(u) if (edge[k].f && !vis[to = edge[k].to]){d[to] = d[u] + 1; vis[to] = true; q.push(to);}}return vis[T];
}
int dfs(int u,int minf){if (u == T || !minf) return minf;int flow = 0,f,to;if (cur[u] == -2) cur[u] = head[u];for (int& k = cur[u]; k != -1; k = edge[k].next)if (d[to = edge[k].to] == d[u] + 1 && (f = dfs(to,min(minf,edge[k].f)))){edge[k].f -= f; edge[k ^ 1].f += f;flow += f; minf -= f;if (!minf) break;}return flow;
}
int maxflow(){int flow = 0;while (bfs()){fill(cur,cur + maxn,-2);flow += dfs(S,INF);}return flow;
}
bool check(int w){nedge = 0; memset(head,-1,sizeof(head));REP(i,N) build(S,i,w),build(i,i + N,K),build(i + 3 * N,i + 2 * N,K);REP(i,N) REP(j,N)if (s[i][j] == 'Y') build(i,j + 2 * N,1);else build(i + N,j + 3 * N,1);REP(i,N) build(i + 2 * N,T,w);return maxflow() >= w * N;
}
int main(){scanf("%d%d",&N,&K); S = 0; T = 4 * N + 1;REP(i,N) scanf("%s",s[i] + 1);int L = 0,R = N,mid;while (L < R){mid = L + R + 1 >> 1;if (check(mid)) L = mid;else R = mid - 1;}cout<<L<<endl;return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8282761.html

BZOJ1305 [CQOI2009]dance跳舞 【网络流】相关推荐

  1. BZOJ1305: [CQOI2009]dance跳舞

    [传送门:BZOJ1305] 简要题意: 有n个男生和n个女生,男生和女生之间存在喜欢关系(只可能互相喜欢,不存在单向喜欢),给出一个字符矩阵代表男生女生之间的关系.他们要跳舞,跳舞的时候有歌,可以跳 ...

  2. [bzoj1305][CQOI2009]dance跳舞

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

  3. 【BZOJ 1305】 [CQOI2009]dance跳舞

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

  4. 【BZOJ1305】 [CQOI2009]dance跳舞

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

  5. BZOJ 1305 [CQOI2009]dance跳舞

    这是一道最大流的模版题 一定要记住不能开出来重点呀 #include <queue> #include <cstdio> #include <cstring> #i ...

  6. 【BZOJ 1305】[CQOI2009]dance跳舞

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 男生和女生每个人都分身成两个节点 即x[1],x[2]和y[1],y[2] 然后如果i和j不相互喜欢 那么add(x[i][2],y ...

  7. bzoj1305【CQOI2009】dance 跳舞

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

  8. 【CQOI2009】跳舞

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

  9. 【BZOJ - 1305】dance跳舞(拆点网络流,建图,最大流,残留网络上跑最大流)

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

最新文章

  1. idea中文乱码问题
  2. ajax请求多张图片数据库,ajax上传多文件,一次上传多张图片
  3. oracle 执行sql参数混乱,乱用_allow_resetlogs_corruption参数导致悲剧
  4. 武汉自考本科计算机专业哪个好,2020年武汉自考本科专业有哪些?
  5. Little Sub and Game
  6. 中北大学c语言程序设计期末_中北大学:工作室联合育人 家校情温暖寒冬
  7. ClassNotFoundException:是否减慢了您的JVM?
  8. git 修改tag 备注_【Git】第十二章:Git高级实战技巧
  9. 清华AI画虾师,想当现代齐白石
  10. 新丰机器人_韶关新丰:智能巡检开启配电网运维新模式
  11. 【VC++游戏开发#十】2D篇 —— 人工智能(一):滚动地图 用鼠标控制人物的走动
  12. DCDC中电感的计算
  13. oracle中同义词作用,Oracle同义词创建及其作用
  14. 超强大的数学计算器——WolframAlpha(含安卓下载连接)
  15. 基于深度学习的车辆信息识别(一):车辆颜色识别
  16. 一个男人不顾家的表现有哪些?
  17. 性能测试能力提升-基准、负载、压力、容量测试
  18. Linux下的启动oracle服务 启动监听 开放端口操作
  19. 2.ipv6苹果上线 新网域名不支持AAAA 域名DNS解析AAAA -----如何将DNS从新网转到DNSPod?
  20. 织梦html编辑器,织梦dedecms自带文本编辑器ckeditor更换为kindeditor编辑器带代

热门文章

  1. windows server搭建php mysql数据库_windows server 2008/2012安装php iis7 mysql环境搭建教程...
  2. excel数据库_EXCEL憋出大招,逆袭大数据的黑马出现了
  3. $.extend(true,{},a,b)解析
  4. ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决
  5. vmware中NAT模式下,虚拟机与主机能ping通 为什么虚拟机不能上网
  6. asp.net中日志框架Log4Net的使用
  7. SQL SERVER--单回话下的死锁
  8. rocketmq namesrv 第一章启动过程
  9. Mono项目的新进展
  10. 1089 狼人杀-简单版 (20分)