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