BZOJ 1305: [CQOI2009]dance跳舞

来源:互联网 发布:巴以冲突 知乎 编辑:程序博客网 时间:2024/05/21 11:28

1305: [CQOI2009]dance跳舞

啊啊啊noi同步赛弃疗来刷水题了不知道会不会被老师打死

。。。

曾经用几行贪心水过vijos和luogu的题。。终于跪在了bzoj面前

显然答案具有单调性,考虑二分(暴力枚举也可以)

考虑对答案x的可行性验证:

对于每一个人拆成两个点,p,p'

p表示连向喜欢的,p'则是不喜欢的

那么对于喜欢的两个人连p,否则连p'

然后考虑k的限制,我们在同一个人的p和p'间连k的边


然后,S向男生连流量x的边,女生向t连流量x的边

然后跑dinic

如果满流,说明答案可行

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>#include <string>#include <map>#include <cstring>#include <ctime>#include <vector>#define inf 1e9#define ll long long#define maxm 500010#define maxn 1001#define For(i,j,k) for(int i=j;i<=k;i++)#define Dow(i,j,k) for(int i=k;i>=j;i--)using namespace std;inline ll read(){   ll x=0,f=1;char ch=getchar();   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}  while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}  return x*f; }inline void write(ll x){    if (x<0) putchar('-'),x=-x; if (x>=10) write(x/10);   putchar(x%10+'0');  }inline void writeln(ll x){write(x);puts("");}int dis[2001],q[2001],S,T,n,like[201][201],poi[200001],nxt[200001],v[200001],head[20001],ANS;int k,ans,cnt;char s[201];inline void add(int x,int y,int z){poi[++cnt]=y;nxt[cnt]=head[x];v[cnt]=z;head[x]=cnt;poi[++cnt]=x;nxt[cnt]=head[y];v[cnt]=0;head[y]=cnt;}inline bool bfs(){For(i,1,T)dis[i]=0;int l=1,r=1;q[1]=S;dis[S]=1;while(l<=r){for(int i=head[q[l]];i;i=nxt[i])if(!dis[poi[i]]&&v[i])dis[poi[i]]=dis[q[l]]+1,q[++r]=poi[i];l++;}return dis[T]!=0;}inline int dfs(int x,int flow){if(x==T)return flow;int used=0;for(int i=head[x];i;i=nxt[i]){if(v[i]&&dis[poi[i]]==dis[x]+1){int mi=min(v[i],flow-used);int tmp=dfs(poi[i],mi);v[i]-=tmp;v[i^1]+=tmp;used+=tmp;if(used==flow)return flow;}}return used;}inline void dinic(){while(bfs())ans+=dfs(S,inf);}inline bool check(int x){S=4*n+1;T=S+1;cnt=1;For(i,1,T)head[i]=0;For(i,1,n)For(j,1,n){if(like[i][j])add(i,j+3*n,1);else add(i+n,j+2*n,1);}For(i,1,n)add(i,i+n,k),add(i+2*n,i+3*n,k);For(i,1,n)add(S,i,x),add(3*n+i,T,x);ans=0;dinic();if(ans==x*n)return 1;else return 0;}int main(){n=read();k=read();For(i,1,n){scanf("\n%s",s+1);For(j,1,n)if(s[j]=='Y')like[i][j]=1;}int l=1,r=n;while(l<=r){int mid=(l+r)>>1;if(check(mid))ANS=max(ANS,mid),l=mid+1;else r=mid-1;}writeln(ANS);}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 指环扣松了怎么办视频 奇迹mu端游杀人了怎么办 奇迹最强者号找不着了怎么办 v领地退不了押金怎么办 全民奇迹sf钻石变负数怎么办 电脑上的新建没有了怎么办 火车上行李箱砸人怎么办 违建拆除后怎么办房产证 外地车遇到限号怎么办 双号限行 违了怎么办 下高速当地限行怎么办 下高速发现限号怎么办 下高速正好限号怎么办 限号不让下高速怎么办 我的歌没有编曲怎么办 奇迹暖暖以前的账号怎么办 孕妇误吃桃胶了怎么办? 孕4个月吃了桃胶怎么办 刚怀孕吃了桃胶怎么办 额头被打了个包怎么办 裤子被84掉颜色怎么办 高中生晚上偷家里电脑上网怎么办 住高层睡不好觉怎么办 水瓶座如果恨我们了该怎么办 不锈钢保温瓶不保温了怎么办 壁纸颜色选深了怎么办 客厅壁纸太暗了怎么办 别人说你衣服丑怎么办 高楼热水器风大熄火怎么办 1楼独立下水2楼怎么办 宜家家具不会装怎么办 服务行业遇到低素质客户怎么办 服务类没有进项票怎么办 教师对学生缺乏耐心怎么办 买了竹料烂尾楼怎么办 刚毕业想换工作怎么办 客厅灯变不了光怎么办 塑料镀铝浸底漆咬底怎么办 标志408钥匙掉了怎么办 房本测绘页丢了怎么办 房本测绘页信息有误怎么办