BZOJ 1305: [CQOI2009]dance跳舞 (二分答案网络流|错误的贪心)

题目
循规蹈矩的做法是比较显然的。
有着看似严谨的贪心
最后的评论一语道出贪心的错误。
有些的度数看似是有很多,但是因为对方太忙,都是废的度数。。。
所有人度数一致才可以套结论。。。。。。

A C   C o d e \rm AC \ Code AC Code

#include<bits/stdc++.h>
#define maxn 250
#define maxm 50005
#define inf 0x3f3f3f3f
using namespace std;

int n,k;
char mp[55][55];
int info[maxn],Prev[maxm],to[maxm],cap[maxm],cnt_e=1;
void Node(int u,int v,int c){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v,cap[cnt_e]=c; }
void Line(int u,int v,int c){ Node(u,v,c),Node(v,u,0); }  

int S,T,h[maxn],gap[maxn];	

int aug(int now,int Max)
{
	if(now == T) return Max;
	int inc , st = Max;
	for(int i=info[now];i;i=Prev[i])
		if(cap[i] && h[to[i]]+1==h[now])
		{	inc = aug(to[i],min(cap[i],st));
			st-=inc,cap[i]-=inc,cap[i^1]+=inc;
			if(!st || h[S]>T) return Max-st;
		}
	if(!--gap[h[now]]) h[S] = T+1;
	++gap[++h[now]];
	return Max-st;
}

bool check(int mid)
{
	memset(info,0,sizeof info),cnt_e=1;
	for(int i=1;i<=n;i++) Line(S,i,mid),Line(i+n,T,mid),Line(i,i+2*n,k),Line(i+3*n,i+n,k);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(mp[i][j] == 'Y')
				Line(i,j+n,1);
			else 
				Line(i+2*n,j+3*n,1);
	memset(h,0,sizeof h);
	memset(gap,0,sizeof gap);
	int stm = 0;
	for(gap[0]=T;h[S]<=T;)
		stm += aug(S,inf);
	if(stm == mid * n)
		return 1;
	return 0;
}

int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++) scanf("%s",mp[i]+1);
	int L = 0 , R = n , mid;
	S = 4*n+1,T = 4*n+2;
	for(;L<R;)
	{
		mid = (L+R+1) >> 1;
		if(check(mid)) L = mid;
		else R = mid - 1;
	}
	printf("%d\n",L);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值