【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

男生和女生每个人都分身成两个节点
即x[1],x[2]和y[1],y[2]

然后如果i和j不相互喜欢

那么add(x[i][2],y[j][2],1)

如果相互喜欢的话

add(x[i][1],y[j][1],1)

然后对于每个男生

add(x[i][1],y[i][1],k)

对于每个女生

add(y[i][2],y[i][1],k)

然后对于每个男生

add(s,x[i][1],mid)

add(y[i][1],t,mid)

这里的mid是二分的值。

这个mid就是舞会的轮数了。

如果能够满流显然每个人都能配对跳mid支舞

显然是有单调性的。

(然后发现原来的dicnic的模板是错的。。边数的计算要特别careful.

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 50; struct abc{
int nex,en,flow;
}bian[2][N*N*2+8*N+10]; int n,k,x[N+10][3],y[N+10][3],fir[2][N*4+10],tfir[N*4+10],totm,deep[N*4+10];
int cnt = 0;
bool bo[N+10][N+10];
char s[N+10];
queue<int> dl; //每个男人分为(x1,x2)
//每个女人分为(y1,y2) void add(int x,int y,int cost,int i){
bian[i][totm].nex = fir[i][x];
fir[i][x] = totm;
bian[i][totm].en = y,bian[i][totm].flow = cost;
totm++; bian[i][totm].nex = fir[i][y];
fir[i][y] = totm;
bian[i][totm].en = x,bian[i][totm].flow = 0;
totm++;
} bool bfs(int s,int t){
dl.push(s);
memset(deep,255,sizeof deep);
deep[s] = 0; while (!dl.empty()){
int x = dl.front();
dl.pop();
for (int temp = fir[1][x]; temp!= -1 ;temp = bian[1][temp].nex){
int y = bian[1][temp].en;
if (deep[y]==-1 && bian[1][temp].flow>0){
deep[y] = deep[x] + 1;
dl.push(y);
}
}
}
return deep[t]!=-1;
} int dfs(int x,int t,int limit){
if (x == t) return limit;
if (limit == 0) return 0;
int cur,f = 0;
for (int temp = tfir[x];temp!=-1;temp = bian[1][temp].nex){
tfir[x] = temp;
int y = bian[1][temp].en;
if (deep[y] == deep[x] + 1 && (cur = dfs(y,t,min(limit,bian[1][temp].flow))) ){
f += cur;
limit -= cur;
bian[1][temp].flow -= cur;
bian[1][temp^1].flow += cur;
if (!limit) break;
}
}
return f;
} int get_flow(){
int now = 0;
while (bfs(0,cnt)){
for (int i = 0;i <= cnt;i++) tfir[i] = fir[1][i];
int xxx = dfs(0,cnt,10000);
now+=xxx;
}
return now;
} int main(){
//freopen("F:\\program\\rush\\rush_in.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0);
memset(fir[0],255,sizeof fir[0]);
cin >> n >> k;
for (int i = 1;i <= n;i++){
cin >> (s+1);
for (int j = 1;j <= n;j++)
if (s[j]=='Y'){
bo[i][j] = 1;
}
}
for (int i = 1;i <= n;i++){
for (int j = 1;j <= 2;j++)
x[i][j] = ++cnt;
} for (int i = 1;i <= n;i++)
for (int j = 1;j <= 2;j++)
y[i][j] = ++cnt; cnt++;
for (int i = 1;i <= n;i++){
for (int j = 1;j <= n;j++){
if (bo[i][j])
add(x[i][1],y[j][1],1,0);
else{
add(x[i][2],y[j][2],1,0);
}
}
} for (int i = 1;i <= n;i++){
add(x[i][1],x[i][2],k,0);
add(y[i][2],y[i][1],k,0);
} int l = 0,r = n+1,temp1 = 0;
while (l<=r){
int i = (l+r)>>1; for (int j = 0;j < totm;j++) bian[1][j] = bian[0][j];
for (int j = 0;j <= cnt;j++) fir[1][j] = fir[0][j];
int tt = totm; for (int j = 1;j <= n;j++){
add(0,x[j][1],i,1);
add(y[j][1],cnt,i,1);
}
int temp = get_flow(); if (temp!=i*n){
r = i-1;
}else {
temp1 = i;
l = i+1;
}
totm = tt;
}
cout<<temp1<<endl;
return 0;
}

【BZOJ 1305】[CQOI2009]dance跳舞的更多相关文章

  1. bzoj 1305: [CQOI2009]dance跳舞

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

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

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

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

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

  4. BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...

  5. BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模

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

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

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

  7. bzoj 1305: [CQOI2009]dance 二分+網絡流判定

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1340  Solved: 581[Submit][Sta ...

  8. 1305: [CQOI2009]dance跳舞 - BZOJ

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

  9. 1305: [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4169  Solved: 1804[Submit][Status][Discuss] Descripti ...

  10. BZOJ 1305:dance跳舞(二分+最大流)

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

随机推荐

  1. windowbuilde02 表格创建

    /** * 设置表格 * * * */ private JTable getTable() { if (table == null) { table = new JTable(); //定义列名数组 ...

  2. Vijos——T 1016 北京2008的挂钟 || 洛谷—— P1213 时钟

    https://www.luogu.org/problem/show?pid=1213 题目描述 考虑将如此安排在一个 3 x 3 行列中的九个时钟: 目标要找一个最小的移动顺序将所有的指针指向12点 ...

  3. 嵌入式linux和pc机的linux对照

    linux本身具备的非常大长处就是稳定,内核精悍,执行时须要的资源少.嵌入式linux和普通linux并无本质差别. 在嵌入式系统上执行linux的一个缺点就是其核心架构没有又一次设计过,而是直接从桌 ...

  4. Unity3D:实现人物转向与移动

    在网上有非常多通过射线方式实现的人物行走控制脚本,可是假设仅仅是想通过键盘按键来控制的话.比方进行第三人称视角控制,事实上仅仅须要进行简单的角度变换就可以.思路例如以下: 1.依照顺时针方向设定前.右 ...

  5. maven+springMVC+mybatis 搭建过程

    1.创建maven web 项目 maven 创建web应用命令: mvn archetype:generate -DgroupId=[com.rom]包名 -DartifactId=[cpsrom] ...

  6. 使用ClassLoader类装载器获取系统资源

    使用ClassLoader类装载器获取系统资源 2010-05-11 16:19:39 分类: Java /* ClassLoader 有两种方法获得系统资源,一个种静态方法,一种是实例方法. 静态方 ...

  7. HTTP协议头了解

    Cache-Control:max-age =0 Cache-Control no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验.这对于需要确认认证应用很有用(可以和pu ...

  8. invalidate

    转载请注明出处:                前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解      A ...

  9. kentico中的page template的使用

    父页面使用自己的template 子页面,也使用自己的template. 然后父页面中需要添加一个place holder. 子页面的继承,选择inherit only master page. 这样 ...

  10. 学习 shell —— 条件判断 if 的参数

    1. 文件判断表达式 -e filename:如果 filename 存在(exist),则为真: -d filename:如果 filename 为目录(directory),则为真: -f fil ...