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: 圈地游戏的更多相关文章

  1. BZOJ 3232: 圈地游戏 分数规划+判负环

    3232: 圈地游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 966  Solved: 466[Submit][Status][Discuss] ...

  2. bzoj 3232: 圈地游戏 01分数规划

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...

  3. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  4. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  5. bzoj 3232: 圈地游戏【分数规划+最小割】

    数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...

  6. BZOJ3232: 圈地游戏

    题解: 神题一道... 题解戳这里:http://hi.baidu.com/strongoier/item/0425f0e5814e010265db0095 分数规划可以看这里:http://blog ...

  7. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

  8. bzoj 3991: [SDOI2015]寻宝游戏 虚树 set

    目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...

  9. 【BZOJ3232】圈地游戏 分数规划+最小割

    [BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...

随机推荐

  1. FileTable的创建和使用

    1. 首先要在实例级别启用FILESTREAM,打开Sql Server Configuration Manager窗口,双击需要设置的SQL SERVER实例进行设置. 2. 需要更改 SQL SE ...

  2. Inside Amazon's Kafkaesque "Performance Improvement Plans"

    Amazon CEO and brilliant prick Jeff Bezos seems to have lost his magic touch lately. Investors, empl ...

  3. openoffice centos7.4 安装

    其他是配置好java环境后操作 1.下载软件 http://www.openoffice.org/download/other.html 2.安装 tar xf Apache_OpenOffice_4 ...

  4. 一、BOM 二、DOM

    一.BOM(window对象)###<1>window属性对象 window.location 当前浏览器的地址对象 window.history 浏览器访问过的地址对象 window.o ...

  5. ZT 链表逆序

    链表逆序 原帖地址http://blog.csdn.net/niuer09/article/details/5961004 分类: C/C++2010-10-23 17:23 18425人阅读 评论( ...

  6. Echarts使用小结

    还是先来简单的了解一下Echart是什么吧? ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前 ...

  7. Android Studio3.0 配置AndroidAnnotation注解框架

    前言android学习了一段时间后,想要开发一款App,但是一些复杂的代码写多了实在麻烦,就到网上找了找简便的方法,于是在众多的注解开发框架中,找到了Android Annotation这个框架,这里 ...

  8. js如何将时间戳转换为标准时间

    function formatDate(date,fmt){ let o = { 'M+' : date.getMonth() +1, //月份 'd+' : date.getDate(), //日 ...

  9. h5py

    解决办法: sudo apt-get install libhdf5-dev sudo apt-get install python-h5py

  10. typename在C++中的用法

    . //在C++中typename一般用来声明模板的模板参数(template parameter): template<typename T> class X; //T是一个模板参数 . ...