【BZOJ3232】圈地游戏(分数规划,网络流)
【BZOJ3232】圈地游戏(分数规划,网络流)
题面
题解
很神仙的一道题。
首先看到最大化的比值很容易想到分数规划。现在考虑分数规划之后怎么计算贡献。
首先每条边的贡献就变成了\(mid*C\),这个显然啊。考虑一个封闭图形如何计算答案。
发现被计算入答案的边一定是一侧有一个格子被圈进去了,另外一侧的格子没有被圈进去。那么这很像一个最小割。假设格子和源点相连表示被选进了答案,和汇点相连表示在答案以外。那么很明显把一条边两侧的格子给连起来,流量为\(mid*C\)。怎么越来越像一个最大权闭合子图了。。。
那么每个点如果要和源点断开就必定会减小它自身的权值,所以\(S\)向每个格子连格子价值的边。然而忽然发现没有东西和汇点连在一起?因为没有必须不选的格子?不,显然是有的,我们有的边显然和界外相连,所以界外必须额外新建一个点,那么从界外向汇点连一条容量为\(inf\)的边表示强制不能断开,即必须不选。这样一来,拿总的点权减去最小割判定二分即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define inf 1000000000
#define MAX 55
#define MAXL MAX*MAX*4
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;double w;}e[MAXL<<1];
int h[MAX*MAX],cnt=2;
inline void Add(int u,int v,double w)
{
e[cnt]=(Line){v,h[u],w};h[u]=cnt++;
e[cnt]=(Line){u,h[v],w};h[v]=cnt++;
}
int n,m,tot,Sum;
int S,T,Out;
int bh[MAX][MAX],V[MAX][MAX],E1[MAX][MAX],E2[MAX][MAX];
void BuildEdge(double mid)
{
memset(h,0,sizeof(h));cnt=2;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
Add(S,bh[i][j],V[i][j]);
for(int j=1;j<=m;++j)Add(bh[1][j],Out,mid*E1[1][j]);
for(int i=2;i<=n;++i)
for(int j=1;j<=m;++j)
Add(bh[i-1][j],bh[i][j],mid*E1[i][j]);
for(int j=1;j<=m;++j)Add(bh[n][j],Out,mid*E1[n+1][j]);
for(int i=1;i<=n;++i)Add(bh[i][1],Out,mid*E2[i][1]);
for(int i=1;i<=n;++i)
for(int j=2;j<=m;++j)
Add(bh[i][j-1],bh[i][j],mid*E2[i][j]);
for(int i=1;i<=n;++i)Add(bh[i][m],Out,mid*E2[i][m+1]);
}
int level[MAX*MAX],cur[MAX*MAX];
bool bfs()
{
memset(level,0,sizeof(level));
queue<int> Q;level[S]=1;Q.push(S);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
if(fabs(e[i].w)>1e-5&&!level[e[i].v])
level[e[i].v]=level[u]+1,Q.push(e[i].v);
}
return level[T];
}
double dfs(int u,double flow)
{
if(u==T||flow<1e-5)return flow;
double ret=0;
for(int &i=cur[u];i;i=e[i].next)
{
int v=e[i].v;double d;
if(fabs(e[i].w)>1e-5&&level[v]==level[u]+1)
{
d=dfs(v,min(flow,e[i].w));
ret+=d;flow-=d;
e[i].w-=d;e[i^1].w+=d;
}
}
if(ret<1e-5)level[u]=0;
return ret;
}
double Dinic()
{
double ret=0;
while(bfs())
{
for(int i=S;i<=T;++i)cur[i]=h[i];
ret+=dfs(S,inf);
}
return ret;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)bh[i][j]=++tot,V[i][j]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)Sum+=V[i][j];
S=0;T=Out=tot+1;
for(int i=1;i<=n+1;++i)
for(int j=1;j<=m;++j)E1[i][j]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m+1;++j)E2[i][j]=read();
double l=0,r=50000;
while(r-l>1e-5)
{
double mid=(l+r)/2;
BuildEdge(mid);
if(Sum-Dinic()>1e-5)l=mid;
else r=mid;
}
printf("%.3lf\n",l);
return 0;
}
【BZOJ3232】圈地游戏(分数规划,网络流)的更多相关文章
- 【BZOJ3232】圈地游戏 分数规划+最小割
[BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...
- BZOJ 3232: 圈地游戏 分数规划+判负环
3232: 圈地游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 966 Solved: 466[Submit][Status][Discuss] ...
- bzoj3232圈地游戏——0/1分数规划+差分建模+判环
Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到 ...
- $BZOJ3232$ 圈地游戏 网络流
正解:最小割+01分数规划 解题报告: 传送门$QwQ$ 感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤 首先看到这个分数 ...
- BZOJ3232: 圈地游戏
题解: 神题一道... 题解戳这里:http://hi.baidu.com/strongoier/item/0425f0e5814e010265db0095 分数规划可以看这里:http://blog ...
- 【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)
题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除 ...
- BZOJ1486 HNOI2009 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
- BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】
题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...
- 【XSY2718】gift 分数规划 网络流
题目描述 有\(n\)个物品,买第\(i\)个物品要花费\(a_i\)元.还有\(m\)对关系:同时买\(p_i,q_i\)两个物品会获得\(b_i\)点收益. 设收益为\(B\),花费为\(A\), ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
随机推荐
- Oracle中Error while performing database login with the XXXdriver; Listener refused the connection with the following error; ORA-12505,TNS:listener does not currently know of SID given inconnect descrip
一次连接数据库怎么也连接不上,查了多方面资料,终于找到答案,总结 首先应该保证数据库的服务启动 在myeclipse的数据库视图中点 右键->new 弹出database driver的窗口, ...
- WPF Style
<Application x:Class="WzlyTool.App" xmlns="http://schemas.microsoft.com/winfx/20 ...
- 20155308《网络对抗》Exp4 恶意代码分析
20155308<网络对抗>Exp4 恶意代码分析 实践说明 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...
- 20155339平措卓玛 Exp1 PC平台逆向破解(5)M
20155339平措卓玛 Exp1 PC平台逆向破解(5)M 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖 ...
- 【php增删改查实例】 第二节 - MYSQL环境配置
安装好xampp后,会自带一个mysql,也就是说,正常情况下,你直接这样: 就可以启动mysql了. 如果你了,下面的步骤就别看了哈. if( 启动成功 ){ return; } 如果你的电脑上已经 ...
- [Luogu5048] [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]
题意 长为 \(n\) 的序列,询问区间众数,强制在线. \(n\leq 5\times 10^5\). 分析 考虑分块,暴力统计出整块到整块之间的众数次数. 然后答案还可能出现在两边的两个独立的块中 ...
- 通过实例来理解paxos算法
背景 Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有 ...
- PowerBI开发 第十三篇:增量刷新
PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...
- 设计模式 笔记 迭代器模式 Iterator
//---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...
- Runtime.getRuntime().addShutdownHook(Thread thread) 程序关闭时钩子,优雅退出程序
根据 Java API, 所谓 shutdown hook 就是已经初始化但尚未开始执行的线程对象.在Runtime 注册后,如果JVM要停止前,这些 shutdown hook 便开始执行.也就是在 ...