bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232
心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上...
今天再认真看看,找出几处小错,就A了...
关于题解:https://www.cnblogs.com/CQzhangyu/p/6790404.html
关于最大权闭合子图:http://www.cnblogs.com/wuyiqi/archive/2012/03/12/2391960.html
对于这道题,首先,可以01分数规划,于是问题变成二分比值后找最大答案;
把每个格子看做一个点,点之间的边权是格子边上的值*二分的比值,则割掉这条边表示两个点中选一个,那么自然一内一外,它们的交界也就成了封闭路线的边界;
把外围看做还有一圈点,于是边缘的点向汇点连外围边界的值的边;
然后源点向每个点连权值为点(格子)权的边,割这条边表示不要这个点的贡献了;
在这个图上跑最小割,总点权减去最小割就是答案;
注意 ct = 1 !边权要乘二分的比值 k !
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define eps 1e-6
#define inf 1e9
using namespace std;
int const xn=,xm=,xe=5e4;//
int n,m,s,t,w[xn][xn],sid[xn][xn][xn][xn],S,T;
int dis[xm],hd[xm],ct=,to[xe],nxt[xe],cur[xm];
int e1[xn][xn],e2[xn][xn];
double ans,c[xe],sum;
queue<int>q;
void add(int x,int y,double z)
{
to[++ct]=y; nxt[ct]=hd[x]; c[ct]=z; hd[x]=ct;
to[++ct]=x; nxt[ct]=hd[y]; c[ct]=; hd[y]=ct;
}
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
int id(int x,int y){return (x-)*m+y;}
int P(int x,int y){return (x-)*m+y;} bool bfs()
{
while(q.size())q.pop();
memset(dis,,sizeof dis);
dis[s]=; q.push(s);
while(q.size())
{
int x=q.front(); q.pop();
for(int i=hd[x],u;i;i=nxt[i])
if(!dis[u=to[i]]&&c[i]>eps)dis[u]=dis[x]+,q.push(u);
}
return dis[t];
}
double dfs(int x,double fl)
{
if(x==t)return fl;
double ret=;
for(int &i=cur[x],u;i;i=nxt[i])
{
if(dis[u=to[i]]!=dis[x]+||c[i]<=eps)continue;
double tmp=dfs(u,min(fl-ret,c[i]));
if(tmp<eps)dis[u]=;
c[i]-=tmp; c[i^]+=tmp;
ret+=tmp; if(fl-ret<eps)return ret;
}
return ret;
}
bool ck(double k)
{
memset(hd,,sizeof hd); ct=;//=1 而不是 0 !!!!!!!!!!!!!!!!!!!!!!!
s=; t=n*m+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int x=id(i,j);
add(s,x,w[i][j]);
if(i==)add(x,t,sid[i-][j][i][j]*k);
if(j==)add(x,t,sid[i][j-][i][j]*k);
if(i==n)add(x,t,sid[i][j][i+][j]*k);
if(j==m)add(x,t,sid[i][j][i][j+]*k);
int y=id(i+,j),z=id(i,j+);
if(i<n)add(x,y,k*sid[i][j][i+][j]),add(y,x,k*sid[i][j][i+][j]);
if(j<m)add(x,z,k*sid[i][j][i][j+]),add(z,x,k*sid[i][j][i][j+]);//k*!!!
}
double ans=;
while(bfs())
{
memcpy(cur,hd,sizeof hd);
ans+=dfs(,inf);
}
return sum-ans>eps;
}
int main()
{
n=rd(); m=rd(); s=; t=n*m+; double l=,r=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)w[i][j]=rd(),r+=w[i][j],sum+=w[i][j];
for(int i=;i<=n+;i++)
for(int j=;j<=m;j++)sid[i-][j][i][j]=rd();
for(int i=;i<=n;i++)
for(int j=;j<=m+;j++)sid[i][j-][i][j]=rd();
while(l-r<=eps)
{
double mid=(l+r)*0.5;
if(ck(mid))ans=mid,l=mid+eps;
else r=mid-eps;
}
printf("%.3lf\n",ans);
return ;
}
bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)的更多相关文章
- bzoj 3232: 圈地游戏【分数规划+最小割】
数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- zoj 2676 Network Wars 0-1分数规划+最小割
题目详解出自 论文 Amber-最小割模型在信息学竞赛中的应用 题目大意: 给出一个带权无向图 G = (V,E), 每条边 e属于E都有一个权值We,求一个割边集C,使得该割边集的平均边权最小,即最 ...
- HDU 2676 Network Wars 01分数规划,最小割 难度:4
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1676 对顶点i,j,起点s=1,终点t=n,可以认为题意要求一组01矩阵use ...
- bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
- BZOJ 3232: 圈地游戏 分数规划+判负环
3232: 圈地游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 966 Solved: 466[Submit][Status][Discuss] ...
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...
随机推荐
- Auto-Scaling Web Applications in Clouds: A Taxonomy and Survey读书笔记
这篇文章是发在2018年CSUR上的一篇文章,主要是讲虚拟机上web应用的auto-scaling技术的分类 近年来许多web 应用服务商将他们的应用迁移到云数据中心,为什么要迁移到云上呢?其中一个重 ...
- 最近切的两题SCC的tarjan POJ1236 POJ2186
两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书 POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点) ...
- 安装Android SDK(东软开源镜像介绍)
启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...
- HTTP错误:java.lang.IllegalArgumentException: Illegal character in scheme at index 0: http://xxxxxx
读取T卡文件里的域名,HTTP请求出现如下错误 java.lang.IllegalArgumentException: Illegal character in scheme at index 0: ...
- 51nod1040 最大公约数之和
求$\sum_{i=1}^{n}(i,n)$.n<=1e9. $\sum_{i=1}^{n}(i,n)=\sum_{d|n}d\sum_{i=1}^{n}[(i,n)=d]=\sum_{d|n} ...
- BZOJ2038 (莫队)
BZOJ2038: 小Z的袜子 Problem : N只袜子排成一排,每次询问一个区间内的袜子种随机拿两只袜子颜色相同的概率. Solution : 莫队算法真的是简单易懂又暴力. 莫队算法用来离线处 ...
- 视图中 jquery 使用data属性
示例:<input id='username' data-id="{$val['id']}" data-userName="{$val['name']}" ...
- Javaee的霸主之spring系列
Spring 顶级框架 谈及微服务,作为当前主流的企业框架Spring,它提供了一整套相关的顶级项目,能让开发者快速的上手实现自己的应用,今天就介绍下Spring旗下各个顶级项目: Spring IO ...
- Gerrit实现代码审计(code review)
1.Gerrit是个啥? 实现代码审计,比git(gitlab.github)多了代码审计的功能. 2.两类角色 角色1:我是代码编写者,只能写代码和提交给审计者代码,不能直接把代码合并到线上发布 角 ...
- 蓦然回首,Java 已经 24 岁了!
01.蓦然 真没想到,Java 竟然 24 岁了(算是 90 后)! 提起 Java,印象最深刻的当然就是: class Cmower { public static void main(Strin ...