[Wf2011]Chips Challenge
两个条件都不太好处理
每行放置的个数实际很小,枚举最多放x
但还是不好放
考虑所有位置先都放上,然后删除最少使得合法
为了凑所有的位置都考虑到,把它当最大流
但是删除最少,所以最小费用
行列相关,左行点,右列点
S到行,流“能填位置”费0
列到T,流“能填位置”费0
i行到i列,流x,即枚举的最大个数
空位(i,j),i行连j列,流1费0
最小费用最大流
意义:流过i行到i列的流量,象征留下一个芯片
流过费用为1的,象征把这个芯片删除。
最大流保证所有位置都考虑到了
最小费用使得最少。
可以发现最后的结果一定满足条件1
条件2?
最大流为flow,费用为cos,总共的位置(多出来的+必填)=sum
放置了tot=sum-cos
如果有x/tot<=A/B那么更新ans=max(ans,tot)
x一定时,tot越大,越可能比A/B小。和最小费用相符。
虽然可能x过大,但是答案一定可以枚举到。
代码:
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=;
const int P=;
const int inf=0x3f3f3f3f;
int n,A,B;
struct node{
int nxt,to;
int c,w;
}e[*(N*N+*N)+];
int hd[P],cnt=;
int s,t;
void add(int x,int y,int w,int c){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
e[cnt].c=c;
e[cnt].w=w;hd[x]=cnt; e[++cnt].nxt=hd[y];
e[cnt].to=x;
e[cnt].c=-c;
e[cnt].w=;hd[y]=cnt;
}
int dis[P];
bool in[P];
int incf[P],pre[P];
queue<int>q;
int ans,flow,cos;
int l[N],h[N];
char mp[N][N];
bool spfa(){
memset(dis,inf,sizeof dis);
memset(pre,,sizeof pre);
while(!q.empty()) q.pop();
dis[s]=;
incf[s]=inf;
q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
in[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(e[i].w){
if(dis[y]>dis[x]+e[i].c){
dis[y]=dis[x]+e[i].c;
pre[y]=i;
incf[y]=min(incf[x],e[i].w);
if(!in[y]){
in[y]=;
q.push(y);
}
}
}
}
}
if(dis[t]==inf) return false;
return true;
}
void upda(){
int x=t;
while(pre[x]){
e[pre[x]].w-=incf[t];
e[pre[x]^].w+=incf[t];
x=e[pre[x]^].to;
}
flow+=incf[t];
cos+=dis[t]*incf[t];
}
void EK(int lim){
cos=;flow=;
memset(hd,,sizeof hd);
cnt=;
s=,t=*n+;
for(reg i=;i<=n;++i) {
add(s,i,l[i],);
add(i+n,t,h[i],);
add(i,i+n,lim,);
}
for(reg i=;i<=n;++i){
for(reg j=;j<=n;++j){
if(mp[i][j]=='.') add(i,j+n,,);
}
}
while(spfa()) upda();
}
void clear(){
ans=-;
for(reg i=;i<=n;++i) l[i]=n;
for(reg j=;j<=n;++j) h[j]=n;
}
int main(){
int o=;
while(){
rd(n);rd(A);rd(B);
if(n==&&A==&&B==) break;
++o;
clear();
int can=;
int alr=;
for(reg i=;i<=n;++i){
scanf("%s",mp[i]+);
for(reg j=;j<=n;++j){
if(mp[i][j]=='/') --l[i],--h[j];
else ++can;
if(mp[i][j]=='C') ++alr;
}
}
for(reg x=;x<=n;++x){
EK(x);
int tot=can-cos;
if(flow==can&&A*tot>=x*B) ans=max(ans,tot);
}
ans-=alr;
printf("Case %d: ",o);
if(ans<) printf("impossible");
else printf("%d",ans);
puts("");
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/1/8 10:23:22
*/
最小费用最大流可以考虑两个限制
最大流限制合法
费用流限制优秀
[Wf2011]Chips Challenge的更多相关文章
- 【BZOJ 2673】[Wf2011]Chips Challenge
题目大意: 传送门 $n*n$的棋盘,有一些位置可以放棋子,有一些已经放了棋子,有一些什么都没有,也不能放,要求放置以后满足:第i行和第i列的棋子数相同,同时每行的棋子数占总数比例小于$\frac{A ...
- Bzoj2673 3961: [WF2011]Chips Challenge 费用流
国际惯例题面:如果我们枚举放几个零件的话,第二个限制很容易解决,但是第一个怎么办?(好的,这么建图不可做)考虑我们枚举每行每列最多放几个零件t,然后计算零件总数sum.这样如果可行的话,则有t*B&l ...
- BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流
https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...
- bzoj3961[WF2011]Chips Challenge
题意 给出一个n*n的网格,有些格子必须染成黑色,有些格子必须染成白色,其他格子可以染成黑色或者白色.要求最后第i行的黑格子数目等于第i列的黑格子数目,且某一行/列的格子数目不能超过格子总数的A/B. ...
- bzoj 3961: [WF2011]Chips Challenge【最小费用最大流】
参考:https://blog.csdn.net/Quack_quack/article/details/50554032 神建图系列 首先把问题转为全填上,最少扣下来几个能符合条件 先考虑第2个条件 ...
- [2011WorldFinal]Chips Challenge[流量平衡]
Chips Challenge Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
- 解题:BZOJ 2673 World Final 2011 Chips Challenge
题面 数据范围看起来很像网络流诶(滚那 因为限制多而且强,数据范围也不大,我们考虑不直接求答案,而是转化为判定问题 可以发现第二个限制相对好满足,我们直接枚举这个限制就可以.具体来说是枚举所有行中的最 ...
- 【题解】uva1104 chips challenge
原题传送门 题目分析 给定一张n*n的芯片. '.'表示该格子可以放一个零件. 'C'表示该格子已经放了一个零件(不能拆下). '/'表示该格子不能放零件. 要求在芯片的现有基础上,放置尽可能多的零件 ...
随机推荐
- 学习HTML 第一节.小试牛刀
此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...
- docker简单使用+django+uwsgi+nginx项目部署
使用docker 搭建 centos7 环境: 主机环境:windows 10专业版 一.安装docker Hub.docker.com官网下载 docker for windows 安装完成后,任务 ...
- phpcms v9手机站不支持组图($pictureurls)的修改
phpcms v9自带的手机门户网站,有时候我们需要用到组图功能$pictureurls,我在做的时候发现,如果$pictureurls中只有一张图片会正常显示,但是如果有两张或两张以上的图片的时候, ...
- JAVA学习笔记--匿名内部类
匿名内部类,即没有名字的内部类. 我们在编写JAVA程序时,往往要创建很多类,类是可以被重复使用的.但有时,我们创建了一个类,却只需要使用该类一次,那么单独为其编写一个类就显得有些麻烦,这时可以使用匿 ...
- ECharts模块化使用5分钟上手
什么是EChats? 一句话: 一个数据可视化(图表)Javascript框架,详细?移步这里,类似(推荐)的有 HighCharts,其他? 嗯,先看看吧-- 快速上手: 模块化单文件引入(推荐). ...
- PHP开发中常见的漏洞及防范
PHP开发中常见的漏洞及防范 对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍和防范. ...
- 使用ssh公钥登陆
记录一下使用的具体命令,具体参考: Centos设置禁止密码登录而只使用密钥登录SSH方法 优先参考这个. ssh使用公钥授权不通过的问题解决 Xshell配置ssh免密码登录-密钥公钥(Publi ...
- hadoop对于压缩文件的支持
转载:https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html hadoop对于压缩格式的是透明识别,我们的MapReduce ...
- 【转】MySQL数据类型
1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) ...
- Delphi实现ERP单据列表栏目设置
什么都不用说了,ERP你懂的.一张报表,不同的客户都可以调死你.直接上图 通过这个设置界面,直接生成参数调整报表所用的DBGridEh.对,是DBGridEh,不是DBGrid,也不是CXGrid. ...