bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏
01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\)
\(\sum A-mid\sum B \geq 0\)
然后把所有的B中的权值乘一个mid再跑一个什么算法就星了
这就是道裸题(雾)
二分一个\(mid\),就是一个网络流问题了
选一个点的集合,如果两个方格相邻,一个选了一个没选,总和就要减去中间这条边的权值
然后用最小鸽,如果选就没有损失,不选有格子上价值的损失;两个相邻点一个选了一个不选有中间那条边边权*mid的损失,裸的最小鸽
还有边界上的边怎么办,就边界外面新建一圈点,强制那些点不选。就做完了。
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int 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;
}
const double inf=1e9;
int n,m,val[51][51],wh[51][51],ww[51][51];
int dep[3000],fir[3000],head[3000],dis[1000010],nxt[1000010],id;
double w[1000010];
il vd link(int a,int b,double c,double d=0){
nxt[++id]=head[a],head[a]=id,dis[id]=b,w[id]=c;
nxt[++id]=head[b],head[b]=id,dis[id]=a,w[id]=d;
}
int num[52][52],NUM_ID,S,T;
il bool BFS(){
static int que[3000],hd,tl;
hd=tl=0;
que[tl++]=S;for(int i=1;i<=NUM_ID;++i)dep[i]=0;dep[S]=1;
while(hd^tl){
int x=que[hd];
for(int i=head[x];i;i=nxt[i])
if(w[i]>1e-7&&!dep[dis[i]])dep[dis[i]]=dep[x]+1,que[tl++]=dis[i];
++hd;
}
return dep[T];
}
il double Dinic(int x,double maxflow){
if(x==T)return maxflow;
double ret=0;
for(int&i=fir[x];i;i=nxt[i])
if(w[i]>1e-7&&dep[dis[i]]==dep[x]+1){
double d=Dinic(dis[i],std::min(maxflow,w[i]));
w[i]-=d,w[i^1]+=d;ret+=d,maxflow-=d;
if(maxflow<1e-7)return ret;
}
return ret;
}
il double check(double mid){
memset(head,0,sizeof head);id=1;
for(int i=1;i<=m;++i)link(S,num[0][i],inf),link(S,num[n+1][i],inf);
for(int i=1;i<=n;++i)link(S,num[i][0],inf),link(S,num[i][m+1],inf);
double ret=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
link(num[i][j],T,val[i][j]),ret+=val[i][j];
for(int i=1;i<=n+1;++i)
for(int j=1;j<=m;++j)
link(num[i-1][j],num[i][j],mid*wh[i][j],mid*wh[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=m+1;++j)
link(num[i][j-1],num[i][j],mid*ww[i][j],mid*ww[i][j]);
while(BFS())memcpy(fir,head,sizeof fir),ret-=Dinic(S,inf);
return ret;
}
int main(){
n=gi(),m=gi();
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)val[i][j]=gi();
for(int i=1;i<=n+1;++i)for(int j=1;j<=m;++j)wh[i][j]=gi();
for(int i=1;i<=n;++i)for(int j=1;j<=m+1;++j)ww[i][j]=gi();
for(int i=0;i<=n+1;++i)
for(int j=0;j<=m+1;++j)
num[i][j]=++NUM_ID;
S=++NUM_ID,T=++NUM_ID;
double l=0,r=5000,mid;
while(r-l>1e-6){
mid=(l+r)/2;
if(check(mid)>1e-7)l=mid;
else r=mid;
}
printf("%.3lf\n",l);
return 0;
}
bzoj 3232: 圈地游戏的更多相关文章
- BZOJ 3232: 圈地游戏 分数规划+判负环
3232: 圈地游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 966 Solved: 466[Submit][Status][Discuss] ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...
- bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...
- bzoj 3232: 圈地游戏【分数规划+最小割】
数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...
- BZOJ3232: 圈地游戏
题解: 神题一道... 题解戳这里:http://hi.baidu.com/strongoier/item/0425f0e5814e010265db0095 分数规划可以看这里:http://blog ...
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- 【BZOJ3232】圈地游戏 分数规划+最小割
[BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...
随机推荐
- [UI] 精美UI界面欣赏[9]
精美UI界面欣赏[9]
- web.config设置之system.webServer 详细介绍,为网站设置默认文档
如何:为 IIS 7.0 配置 <system.webServer> 节2008-06-14 22:26http://technet.microsoft.com/zh-cn/sysinte ...
- 【Excel】SUMIF的错位问题
具体情况是这样的: 如图,我们需要求得“一车间”的“发生额总计”,所以我们选择使用SUMIF函数 如果是这样填写函数参数的话,那你的计算结果就会有问题 就会出现下图这样的情况,“发生额总计”为34.8 ...
- openoffice centos7.4 安装
其他是配置好java环境后操作 1.下载软件 http://www.openoffice.org/download/other.html 2.安装 tar xf Apache_OpenOffice_4 ...
- Js 运算符(加减乘除)
1.加法 + +NaN //NaN,有一个为NaN就为NaN var box=Infinity+Infinity //Infinity var box=-Infinity + -Infinity // ...
- 2018.08.31 10:57 swift 学习心得
其实我一直很喜欢swift,我觉得Xcode很先进,买了一台MacBook就可以操作了,蛮好的. var str = "Hello, playground" var myVaria ...
- YBB.DBUtils用法
通用数据访问类库,兼容ADO.ADO.NET方式访问. 利用ProviderFactory工厂方法,支持Oracle(不需要安装客户端).SQL Server.OleDb和ODBC等数据库访问. ht ...
- 【Alpha】Daily Scrum Meeting——blog3
团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 2. 每个人的工作 姓名 已完成工作 计划完成工作 遇到的困 ...
- css3画图那些事(三角形、圆形、梯形等)
闲来无事,写写图形.当时巩固一下css3吧..前端小白,写的不好还请前辈多指教. 三角形 { width:; height:; border-bottom: 140px solid red ; bor ...
- Spring常用jar包的功能
jar名称 描述 spring-framework.jar spring框架比较完整的功能,core+aop+ioc+transaction spring-core.jar 基本上的核心工具类,一些u ...