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

【题意】

在这里输入题意

【题解】

男生和女生每个人都分身成两个节点
即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;
}

最新文章

  1. jQuery fsBanner 手风琴
  2. TP框架常用(一)
  3. javascript字符转直接量和转义字符
  4. python基础学习笔记3
  5. ASP.NET 多语言的实现(后台消息+前台消息+页面自动绑定)
  6. 【Log4j】 log4j.properties 使用
  7. NopCommerce 3.80框架研究(一) 数据访问与持久化
  8. 【转】c++笔试题
  9. node.js笔记——gulp
  10. Yours 的博客开张啦!
  11. 201521123022 《Java程序设计》 第8周学习总结
  12. 51nod 1514 美妙的序列
  13. Urlparse模块
  14. Jmeter----创建第一个接口测试流程
  15. kubectl-常用命令
  16. React之父子组件传递和其它一些要点
  17. centos6.8下搭建编译openwrt的环境
  18. java多线程下的所的概念
  19. 批量MD5命名文件
  20. MySQL(外键变种)

热门文章

  1. 环境搭建Selenium2+Eclipse+Java+TestNG_(一)
  2. G - Arctic Network
  3. 洛谷 U6254 最低费用
  4. Eclipse-去除空白行
  5. Android 零基础学习之路
  6. Visual studio 编译时copy文件、文件夹
  7. CountDownTimer,0,0
  8. 使用cxf3.0.4搭建webservice服务需要的最精简jar包
  9. springMVC、mybatis实现的登录页面(maven)
  10. 备份IIS