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

【题意】

在这里输入题意

【题解】

男生和女生每个人都分身成两个节点
即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. Sping面试题分析

    1.开放中主要使用Spring的什么技术? (1)IOC容器管理各层的组件 (2) 使用AOP配置声明式事务 (3)整合其他框架 2简述AOP和IOC概念 AOP : Aspect  Orienten ...

  2. ASP.NET学习笔记01

    ASP.NET初级工程师的核心要求:能够实现一个基本的网站. ASP.NET初级工程师面试主要要求: 1.基础的数据结构和算法 2.C#编程语言基础 3.网站基础(HTML,CSS,Javascrip ...

  3. Maven错误-Missing artifact com.sun:tools:jar:1.5.0:system 解决方式

    1.Missing artifact com.sun:tools:jar:1.5.0:system Could not resolve dependencies for project com.ifl ...

  4. [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法

    看看我们机房某畸形写的题解:http://blog.csdn.net/sinat_27410769/article/details/46754209 此题为popoQQQ神犇所出,在此orz #inc ...

  5. 【零基础入门学习Python笔记013】元祖:戴上了枷锁的列表

    元组:戴上了枷锁的列表 因为和列表是近亲关系.所以元祖和列表在实际使用上是很相似的. 本节主要通过讨论元素和列表究竟有什么不同学习元祖. 元组是不可改变元素的.插入.删除或者排序都不能够.列表能够随意 ...

  6. 为代码减负之&lt;三&gt;视图(SQL)

    在设计数据库时为了降低数据冗余.一般都会依照三范式去设计,但有时我们在查询时须要通过一字段获取跟这 个字段相关联的好几个字段.可是他们又分布在不同的表中,这时候假设依照正常途径走的话须要同一时候查询好 ...

  7. hdoj--1162--Eddy's picture(最小生成树)

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  8. Oracle SQL性能优化系列

    1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.o ...

  9. 21.QT二进制文件

    #include "mainwindow.h" #include <QApplication> #include <QFile> #include < ...

  10. ios中去除tableView的分割线

     self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;