bzoj 1305: [CQOI2009]dance 二分+網絡流判定
1305: [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 1340 Solved: 581
[Submit][Status]
Description
一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
Input
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。
Output
仅一个数,即舞曲数目的最大值。
Sample Input
YYY
YYY
YYY
Sample Output
HINT
N<=50 K<=30
Source
加强数据By dwellings and liyizhen2
這道題知道是二分+網絡流後,就是完完全全的水題了。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<ctime>
- #include<cmath>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<vector>
- #include<string>
- #include<queue>
- using namespace std;
- #ifdef WIN32
- #define LL "%I64d"
- #else
- #define LL "%lld"
- #endif
- #define MAXN 55
- #define MAXV MAXN*MAXN*2
- #define MAXE MAXV*2
- #define INF 0x3f3f3f3f
- #define INFL 0x3f3f3f3f3f3f3f3fLL
- typedef long long qword;
- inline int nextInt()
- {
- char ch;
- int x=;
- bool flag=false;
- do
- ch=getchar(),flag=(ch=='-')?true:flag;
- while(ch<''||ch>'');
- do x=x*+ch-'';
- while (ch=getchar(),ch<='' && ch>='');
- return x*(flag?-:);
- }
- int n,m;
- char mp[MAXN][MAXN];
- struct Edge
- {
- int val,np;
- Edge *next,*neg;
- }E[MAXE],*V[MAXV];
- int tope=;
- int sour=,sink=;
- inline void addedge(int x,int y,int z)
- {
- //cout<<"Add edge:<"<<tope+1<<">"<<x<<" "<<y<<":"<<z<<endl;
- E[++tope].np=y;
- E[tope].val=z;
- E[tope].next=V[x];
- V[x]=&E[tope];
- E[++tope].np=x;
- E[tope].val=;
- E[tope].next=V[y];
- V[y]=&E[tope];
- E[tope].neg=&E[tope-];
- E[tope-].neg=&E[tope];
- }
- int q[MAXV],lev[MAXV];
- int vis[MAXV],bfstime=;
- bool bfs()
- {
- int i,j;
- int head=-,tail=;
- Edge *ne;
- lev[sour]=;
- vis[sour]=++bfstime;
- q[]=sour;
- while (head<tail)
- {
- for (ne=V[q[++head]];ne;ne=ne->next)
- {
- if (!ne->val || vis[ne->np]==bfstime)continue;
- q[++tail]=ne->np;
- vis[ne->np]=bfstime;
- lev[ne->np]=lev[q[head]]+;
- }
- }
- return vis[sink]==bfstime;
- }
- int dfs(int now,int maxf)
- {
- int ret=,t;
- if (now==sink || !maxf)return maxf;
- Edge* ne;
- for (ne=V[now];ne;ne=ne->next)
- {
- if (!ne->val || lev[ne->np]!=lev[now]+)continue;
- t=dfs(ne->np,min(maxf,ne->val));
- ne->val-=t;
- ne->neg->val+=t;
- maxf-=t;
- ret+=t;
- //cout<<"Flow:"<<now<<"-"<<ne->np<<":"<<x<<"("<<ne->val<<")"<<endl;
- }
- if (!ret)lev[now]=-;
- return ret;
- }
- int dinic()
- {
- int ret=;
- while (bfs())
- {
- ret+=dfs(sour,INF);
- }
- return ret;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- //freopen("output.txt","w",stdout);
- int i,j,k;
- int x,y,z;
- scanf("%d%d\n",&n,&m);
- for (i=;i<n;i++)
- {
- fgets(mp[i],MAXN,stdin);
- }
- int ans=;
- int l=,r=n+,mid;
- while (l+<r)
- {
- memset(V,,sizeof(V));
- tope=-;
- mid=(l+r)>>;
- for (i=;i<n;i++)
- {
- addedge(sour,+i,mid);
- addedge(+i,+i+n*,m);
- addedge(+i+n,sink,mid);
- addedge(+i+n+n*,+i+n,m);
- }
- for (i=;i<n;i++)
- {
- for (j=;j<n;j++)
- {
- if (mp[i][j]!='Y')
- {
- addedge(+i+n*,+n+j+n*,);
- }else
- {
- addedge(+i,+j+n,);
- }
- }
- }
- ans=dinic();
- if (ans!=mid*n)
- {
- r=mid;
- }else
- {
- l=mid;
- }
- }
- printf("%d\n",l);
- return ;
- }
bzoj 1305: [CQOI2009]dance 二分+網絡流判定的更多相关文章
- BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- bzoj 1305: [CQOI2009]dance跳舞
题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )
云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...
- 1305: [CQOI2009]dance跳舞 - BZOJ
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- [CQOI2009]dance跳舞(最大流+二分)
[CQOI2009]dance跳舞 每个人拆成$2$个点,表示是否与喜欢的人跳舞 跳$m$首舞曲时,满足最大流为$n*m$ 二分$m$,跑最大流即可 #include<cstdio> #i ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
随机推荐
- sqlServer将多字段设为主键方法
补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...
- 开源免费天气预报接口API以及全国全部地区代码!!(国家气象局提供)
国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data ...
- iOS开发-javaScript交互
前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...
- jsp获取服务端的访问信息
获取服务端访问信息 public static String getUrl(HttpServletRequest request){ String url = ""; if(req ...
- select/**/*/**/from/**/RegSite
select/**/*/**/from/**/RegSite 这样写sql也是可以的 替换空格
- Jquery Call WebDav
最近研究了一下WebDav,尝试了一下用Jquery.ajax 发生请求访问WebDav. 代码如下: <!DOCTYPE html> <html xmlns="http: ...
- 苹果手机 iframe 无法滚动bug
原来在html5下,iframe 只有 src 属性scroling='no' 解决办法:在iframe外加一层第div,设置样式-webkit-overflow-scrolling:touch;ov ...
- 会话技术之Cookie 和 Session
为什么要使用会话技术 会话从字面上来说就是,就是两个人说话,也就是两个人交流,那么这里说的是计算机web端的交流,因为互联网是基于HTTP传输信息的,而http传输是无状态协议,缺少状态,意味着如果后 ...
- 如何打包成jar包自己看呢?
第一步:选择你要导出的部分 第二步:
- (转)xml序列化
在 .NET Framework 中提供两种串行化方法,一种是二进制法,另一种是xml串行化. 序列化是将对象状态转换为可保持或传输的格式的过程,xml序列化是将对象的公共字段和属性序列化为xml流. ...