一次舞会有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

题意 : 已知有 n 个男女,同时再给你一些男女之间的关系,告诉你每个男生喜欢哪几个女生,讨厌哪几个女生,并且只能和讨厌的女生最多跳 K 次舞蹈,问最终最多可以跳几次舞蹈

思路分析 :经典的最大流构图问题,考虑每个点都连出两个点,一个表示喜欢一个是不喜欢,建图后跑一次最大流即可。

代码示例 :

using namespace std;
#define ll long long
const int maxn = 300;
const int mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f; int n, k;
char mp[55][55];
struct node{
int to, flow, next;
}e[100000];
int head[maxn];
int cnt = 0, s, t; void addedge(int u, int v, int w){
e[cnt].to = v; e[cnt].flow = w; e[cnt].next = head[u]; head[u] = cnt++;
e[cnt].to = u; e[cnt].flow = 0; e[cnt].next = head[v]; head[v] = cnt++;
} int d[maxn], que[maxn]; bool bfs() {
int head1 = 0, tail1 = 1;
memset(d, 0, sizeof(d));
d[0] = 1, que[0] = s; while(head1 < tail1){
int u = que[head1++];
for(int i = head[u]; i != -1; i = e[i].next){
int to = e[i].to;
if (e[i].flow && !d[to]){
d[to] = d[u]+1;
que[tail1++] = to;
}
}
}
return d[t];
} int dfs(int u, int f1){
if (u == t) return f1;
int f = 0; for(int i = head[u]; i != -1; i = e[i].next){
int to = e[i].to;
if (e[i].flow && d[to] == d[u]+1){
int x = dfs(to, min(f1, e[i].flow));
e[i].flow -= x; e[i^1].flow += x;
f1 -= x; f += x;
}
}
if (!f) d[u] = -2;
return f;
} bool check(int x){
s = 0, t = 4*n+1;
memset(head, -1, sizeof(head));
cnt = 0;
for(int i = 1; i <= n; i++){
addedge(s, i, x);
addedge(i, n+i, k);
addedge(2*n+i, 3*n+i, k);
addedge(3*n+i, t, x);
} for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if (mp[i][j] == 'Y'){
addedge(i, 3*n+j, 1);
}
else addedge(n+i, 2*n+j, 1);
}
} int ret = 0;
while(bfs()){
ret += dfs(s, inf);
}
if (ret == x*n) return true;
return false;
} int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n >> k; for(int i = 1; i <= n; i++){
scanf("%s", mp[i]+1);
}
int l = 0, r = n;
int ans;
while(l <= r){
int mid = (l+r)>>1;
if (check(mid)){
ans = mid;
l = mid+1;
}
else r = mid-1; }
printf("%d\n", ans);
return 0;
}

网络流 - 最大流构图入门 bzoj 1305的更多相关文章

  1. 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量

    3931: [CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活 动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器 ...

  2. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

  3. bzoj 1305: [CQOI2009]dance跳舞

    题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...

  4. POJ 1459-Power Network(网络流-最大流-ISAP)C++

    Power Network 时间限制: 1 Sec  内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...

  5. [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)

    题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...

  6. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  7. HDU1532 网络流最大流【EK算法】(模板题)

    <题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量 ...

  8. Redraw Beautiful Drawings(hdu4888)网络流+最大流

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...

  9. A simple Gaussian elimination problem.(hdu4975)网络流+最大流

    A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...

随机推荐

  1. mysql 第三课 jdbc基础操作

    jdbc连接可以大致分为5步: 1.注册驱动 2.获取连接 3.编写语句 4.执行语句 5.关闭连接 其中可以设置参数等等. 1.我们先建一个项目目录: 其中com.etc.dao为数据访问对象 co ...

  2. codeforce 380(div.2)

    A B 略 C:二分,贪心 设d(i, v)为 剩余油量为v时,车开距离i 所需要的最小时间,使用线性规划不难算出: if v < i return INF; //无法到达 if v > ...

  3. P1098 方程解的个数

    题目描述 给出一个正整数N,请你求出x+y+z=N这个方程的正整数解的组数(1<=x<=y<=z<1000).其中,1<=x<=y<=z<=N . 输入 ...

  4. Canvas学习实践:一款简单的动画游戏

    最近学习了下Canvas绘图...突发奇想就有了下面这款简单的小游戏,纯属娱乐~ 废话不多说,直接上代码: <!DOCTYPE html> <html lang="zh&q ...

  5. 基于koa2操作mysql封装例子

    新建better-mysql.js const mysql = require('mysql'); const config = require('../config/sqlConfig.js') l ...

  6. 用es5实现模板字符串

    废话不多说,主要是利用正则表达式replace+eval动态取值(纯属娱乐) String.prototype.myReplace = function(){ return this.replace( ...

  7. location对象相关

    JS是由DOM(文档对象模型).BOM(浏览器对象模型).以及ECMA组成,而location对象是BOM中的一个非常重要的对象,所有关于地址栏信息的内容都在这里.了解location对象之前让我们先 ...

  8. elasticsearch基础知识杂记

    日常工作中用到的ES相关基础知识和总结.不足之处请指正,会持续更新. 1.集群的健康状况为 yellow 则表示全部主分片都正常运行(集群可以正常服务所有请求),但是 副本 分片没有全部处在正常状态. ...

  9. 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)

    开心一刻 一头母牛在吃草,突然一头公牛从远处狂奔而来说:“快跑啊!!楼主来了!” 母牛说:“楼主来了关我屁事啊?” 公牛急忙说:“楼主吹牛逼呀!” 母牛大惊,拔腿就跑,边跑边问:“你是公牛你怕什么啊? ...

  10. Spring Boot + Docker + K8S 简单示例

    前言 最近看了看k8s,感觉用这个管理docker确实比自己写一坨脚本进步太多了,简直不是一个次原的东西. 看着k8s的官方文档随手写了个小Demo,一个基于k8s的spring boot服务. 代码 ...