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_ ...
随机推荐
- hbase multiple SLF4J&n…
hbase multiple SLF4J bindings 警告 hbase shell 和命令操作中经常有个烦人的警告,说SLF4J有多个绑定: hbase(main):003:0> list ...
- Hash表的实现
#include "stdafx.h" #include <iostream> #include <exception> using namespace s ...
- sgu 321 The Spy Network (dfs+贪心)
321. The Spy Network Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: standard ...
- Python 在windows上安装BeautifulSoup和request以及小案例
Python以及PyCharm安装成功后,操作如下: 此时,代码import requests不报错了. 那么,Python 在windows上安装BeautifulSoup,怎么操作呢? 1. 打开 ...
- js关于为DOM对象添加自定义属性的方式和区别
DOM对象的三种在添加自定义属性的方式 一是 通过 “.”+“属性名” 二是 setAttribute()(getAttribute()获取) 三是 直接在元素标签上加属性 如:<div n ...
- Javascript 获取客户端的运营商 IP 地址 等
客户端获取运营商 会弹出安全隐患问题,需要修改IE activx 选项, 非常麻烦,用我的代码可以轻松获取. <script src="JS/jquery-1.4.1.js" ...
- EF中外键重命名,打破原先的约束规则
本人建议玩code frist的人多用用System.ComponentModel.DataAnnotations和System.ComponentModel.DataAnnotations.Sche ...
- 卸载/安装ubuntu系统教程
卸载ubuntu 1.修复Mbr 1.下载软件MbrFix,地址:https://www.softpedia.com/get/System/Hard-Disk-Utils/MBRFix.shtml 2 ...
- linux命令之grep,find
grep命令 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索 ...
- Solidity 最新 0.5.8 中文文档发布
本文首发于深入浅出区块链社区 热烈祝贺 Solidity 最新 0.5.8 中文文档发布, 这不单是一份 Solidity 速查手册,更是一份深入以太坊智能合约开发宝典. 翻译说明 Solidity ...