BZOJ 3232: 圈地游戏 分数规划+判负环
3232: 圈地游戏
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 966 Solved: 466
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 3 3 3
1 3 1 1
3 3 1 0
100 1 1 1
97 96 1 1
1 93 92 92
1 1 90 90
98 1 99 99 1
95 1 1 1 94
1 91 1 1 89
Sample Output
HINT

Source
想法:$max(\frac{\sum D}{\sum C})$,一般都是用分数规划求。
对于一个环,某一行\列所选择的边都是偶数的。被包含的部分就像左右括号包含一样。于是这样建图:
横边:
①$(i,j)->(i,j+1):C_i=边花费,D_i=sum[i][j](即该列的前缀和)$
②$(i,j)->(i,j-1):C_i=边花费,D_i=-sum[i][j](即该列的前缀和)$
竖边:
①$(i,j)->(i+1,j):C_i=边花费,D_i=0$
②$(i,j)->(i-1,j):C_i=边花费,D_i=0$
然后判断合法,即是判断图中是否有非负环,可以权值取反后DFS_spfa求负环(这里有一个比较快的求法)。
另一个解法:考虑如果相邻的格子被同时选中,那么中间的边的费用就不会算进来了,于是变成最小割模型。
#include<cstdio> typedef long long ll;
template<class T>
inline void read(T&x)
{
x=;bool f=;char c=getchar();
while((c<''||c>'')&&c!='-')c=getchar(); if(c=='-')f=,c=getchar();
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
x=f?-x:x;
}
const int MAXN();
const double eps(1e-);
int n,m,val[MAXN][MAXN],row[MAXN][MAXN],line[MAXN][MAXN],sum;
double ans;
struct Node{int nd,nx,v,c;}bot[MAXN*MAXN<<];int tot,first[MAXN*MAXN];
int P(int x,int y){return (x-)*(m+)+y;}
void add(int a,int b,int v,int c){bot[++tot]=(Node){b,first[a],v,c};first[a]=tot;}
void build()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)val[i][j]+=val[i-][j];
for(int i=;i<=n+;i++)
for(int j=;j<=m;j++)
add(P(i,j),P(i,j+),val[i-][j],row[i][j]),
add(P(i,j+),P(i,j),-val[i-][j],row[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m+;j++)
add(P(i,j),P(i+,j),,line[i][j]),
add(P(i+,j),P(i,j),,line[i][j]);
}
double dis[MAXN*MAXN],limt;
bool vis[MAXN*MAXN],flag;
void dfs(int x)
{
vis[x]=true;
for(int v=first[x];v;v=bot[v].nx)
if(dis[bot[v].nd]>dis[x]+bot[v].c*limt-bot[v].v+eps)
{
if(vis[bot[v].nd]){flag=true;return;};
dis[bot[v].nd]=dis[x]+bot[v].c*limt-bot[v].v;
dfs(bot[v].nd);if(flag)return;
}
vis[x]=false;
}
bool ok(double mid)
{
limt=mid; flag=false; for(int i=;i<=(n+)*(m+);i++)dis[i]=vis[i]=;
for(int i=;i<=(n+)*(m+);i++)
{
dfs(i);if(flag)return true;
}
return false;
}
int main()
{
// freopen("C.in","r",stdin);
// freopen("C.out","w",stdout);
read(n);read(m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)read(val[i][j]),sum+=val[i][j];
for(int i=;i<=n+;i++)
for(int j=;j<=m;j++)read(row[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m+;j++)read(line[i][j]);
build();
for(double l=,r=sum,mid;l+eps<r;)
if(ok(mid=(l+r)/))l=mid,ans=mid;else r=mid;
printf("%.3lf",ans);
return ;
}
BZOJ 3232: 圈地游戏 分数规划+判负环的更多相关文章
- bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...
- bzoj 3232: 圈地游戏【分数规划+最小割】
数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...
- 【BZOJ3232】圈地游戏 分数规划+最小割
[BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...
- [bzoj1486][HNOI2009]最小圈——分数规划+spfa+负环
题目 传送门 题解 这个题是一个经典的分数规划问题. 把题目形式化地表示,就是 \[Minimize\ \lambda = \frac{\sum W_{i, i+1}}{k}\] 整理一下,就是 \[ ...
- [bzoj3597][scoi2014]方伯伯运椰子——分数规划,负环
题解 目标就是 \[Maximize\ \lambda = \frac{X-Y}{k}\] 按照分数规划的一般规律, 构造: \[g(\lambda) = \lambda k + Y - X\] 由于 ...
- BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...
随机推荐
- Auto Layout Guide----(三)-----Anatomy of a Constraint
Anatomy of a Constraint 剖析约束 The layout of your view hierarchy is defined as a series of linear equa ...
- HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)
Herbs Gathering 10.76% 1000ms 32768K Collecting one's own plants for use as herbal medicines is pe ...
- js如何判断当前文本的输入状态——中文输入法的那些坑
相信各位在平时接需求的时候肯定会遇到这样的一些需求,例如,要求输入框限制输入长度,限制输入类型,限制只能英文输入,限制只能输入大写字母等等,这时候我们一般的思路无非两种,一种是弹出特定的键盘,第二种是 ...
- MVC笔记-模板页布局
MVC分区后 要加上Ares下的主目录 如:@Html.ActionLink("这个帖子真奇葩", "HotIndex", "Prosceniu ...
- pandas基础(3)_数据处理
1:删除重复数据 使用duplicate()函数检测重复的行,返回元素为bool类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为true >>> df =D ...
- Python实现栈、队列
目录 1. 栈的Python实现 1.1 以列表的形式简单实现栈 1.2 以单链表形式实现栈 2. 队列的Python实现 2.1 以列表实现简单队列 2.2 以单链表形式实现队列 本文将使用py ...
- 获取URL地址栏参数(正则表达式)
]] = isEncode ? decodeURIComponent(arg[2]) : arg[2]; }); return obj;}
- if-else判断语句中经常犯的一个错误
假设题目为:随便给定一个数,三种情况:(1)若小于0,输出为“小于0”:(2)若在0-50之间,则输出“在0-50之间”.(3)若大于50,则输出“大于50”. 解法:如果我这么写,运行一下看看. i ...
- ubuntu18.04中mysql的安装及远程连接配置
1.ubuntu 18.04 下mysql的安装 sudo apt install mysql-server 2.mysql 安装配置 sudo mysql_secure_installation 参 ...
- hdu4403- A very hard Aoshu problem(搜索)
枚举等号的位置,然后暴力搜索一波 这个题本身不难,但它是我第一次使用对拍程序来查找错误,值得纪念. #include<cstdio> #include<string.h> #i ...