【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞

http://hzwer.com/1986.html

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
#define INF 2147483647
#define N 51
int n,m;
char a[N][N];
queue<int>q;
int S,T,nn;
int first[(N<<2)+3],next[2*N*(N+5)],v[2*N*(N+5)],cap[2*N*(N+5)],en;
int d[(N<<2)+3],cur[(N<<2)+3];
void AddEdge(int U,int V,int Cap)
{
	v[en]=V; cap[en]=Cap; next[en]=first[U]; first[U]=en++;
	v[en]=U; cap[en]=0; next[en]=first[V]; first[V]=en++;
}
bool bfs()
{
	memset(d,-1,sizeof(int)*(nn+1)); q.push(S); d[S]=0;
	while(!q.empty())
	  {
	  	int U=q.front(); q.pop();
	  	for(int i=first[U];i!=-1;i=next[i])
	  	  if(d[v[i]]==-1&&cap[i])
	  	    {
	  	      d[v[i]]=d[U]+1;
	  	      q.push(v[i]);
	  	    }
	  }
	return d[T]!=-1;
}
int dfs(int U,int a)
{
	if(U==T||(!a)) return a;
	int Flow=0,f;
	for(int i=first[U];i!=-1;i=next[i])
	  if(d[v[i]]==d[U]+1&&(f=dfs(v[i],min(a,cap[i]))))
	    {
	      cap[i]-=f;
	      cap[i^1]+=f;
	      Flow+=f;
	      a-=f;
	      if(!a)
	        break;
	    }
	if(!Flow) d[U]=-1;
	return Flow;
}
int MaxFlow()
{
	int Flow=0,tmp;
	while(bfs())
	  {
	  	memcpy(cur,first,sizeof(int)*(nn+1));
	  	while(tmp=dfs(S,INF)) Flow+=tmp;
	  }
	return Flow;
}
bool check(int Lim)
{
	memset(first,-1,sizeof(int)*(nn+1)); en=0;
	for(int i=1;i<=n;++i)
	  {
	  	AddEdge(S,1+i,Lim);
	  	AddEdge(1+(n<<1)+i,T,Lim);
	  	AddEdge(1+i,1+n+i,m);
	  	AddEdge(1+n*3+i,1+(n<<1)+i,m);
	  }
	for(int i=1;i<=n;++i)
	  for(int j=1;j<=n;++j)
	    if(a[i][j]==‘Y‘)
	      AddEdge(1+i,1+(n<<1)+j,1);
	    else
	      AddEdge(1+n+i,1+n*3+j,1);
	return MaxFlow()==n*Lim;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%s",a[i]+1);
	int l=0,r=50; S=1; T=(n<<2)+2; nn=(n<<2)+2;
	while(r>l)
	  {
	  	int mid=(l+r+1>>1);
	  	if(check(mid)) l=mid;
	  	else r=mid-1;
	  }
	printf("%d\n",l);
	return 0;
}
时间: 2024-11-08 21:11:56

【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞的相关文章

bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)

1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1和女2之间连边,流量为约束条件k 2.st连男1,女2连ed,流量为二分的mid 3.如果男生i喜欢女生j,就将男1与女2相连(不在约束条件内) 4.如果不喜欢,就将男2与女1相连(在约束条件内) 代码: 1 #include<cstdio> 2 #include<cstring> 3

BZOJ-1305: [CQOI2009]dance跳舞(最大流 增加超级源汇+分裂点+二分 水题)

1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MB Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞.给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲? Inpu

bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞

http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 男yes i 向 女yes j 连流量为1的边 不喜欢则 男no i 向 女no j 连流量为1的边 2.最多与k个不喜欢的人跳 男yes i 向 男no i 连流量为 k的边 女no j 向 女yes j 连流量为k 的边 3. 源点向 男yes i 连流量mid 的边 女yes j 向汇点连流量

bzoj1305: [CQOI2009]dance跳舞

Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞.给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲? Input 第一行包含两个整数n和k.以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢. Outpu

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

云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人dance ,  那么就把每个人拆成 a , b 两个点 . 限制完了之后 , 因为 n <= 50 , 我们可以直接从从小到大枚举 , 一个一个增广 . 具体建图 : boy_a( i ) -> boy_b( i ) ( cap : k ) , girl_b( i ) -> girl_a( i

【BZOJ 1305】 [CQOI2009]dance跳舞

1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1586  Solved: 666 [Submit][Status] Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会"单向喜欢").每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只

AC日记——[CQOI2009]DANCE跳舞 洛谷 P3153

[CQOI2009]DANCE跳舞 思路: 二分+最大流: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 505 #define maxm 30005 #define INF 0x3f3f3f3f int head[maxn],E[maxm],V[maxm],F[maxm],

bzoj 1305: [CQOI2009]dance跳舞

题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容量为x,x即为歌曲数目 对与相互喜欢的男女直在A1,B1间接连容量为1的边 对于相互不喜欢A2练到B2,容量为1 二分x的大小,每次重新构图,判断该图是否满流,慢流则说明该曲目可行 代码 #include<queue> #include<cstdio> #include<cstr

POJ 2112 Optimal Milking 二分答案+最大流

首先二分最长的边,然后删去所有比当前枚举的值长的边,算最大流,看是否能满足所有的牛都能找到挤奶的地方 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include