bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232
当然是0/1分数规划。但加的东西和减的东西不在一起,怎么办?
考虑把它们合在一起。因为边围成的形状像一个环,所以把格子的贡献也放到边上,然后正常判环。
放到边上的方法就是:比如竖着的边,可以在每一行上维护该行格子值前缀和,然后指定那个围成的形状是,比如,逆时针的,那么向上的边就加上到它为止的前缀值,向下的边就减去到它为止的前缀值,然后就能判环了!
这样一定只有一个环。但多个环答案不会更优。
还可以用网络流。与 s 相连表示选、与 t 相连表示不选的话,每个点到 s 连该点权值的边,到 t 连边权为0的边,相邻点之间连它们夹着的边权值的边,这样如果相邻的点一个选了一个没选,就得割它们之间的那条边,就能表示了。
自己写了判环的那个。
注意如果以竖着的边算了围住的部分,就不要再用横着的边同时算了!!
请把 eps 设成 1e-7 而不是 1e-5 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define db double
using namespace std;
const int N=,M=N*N;
const db eps=1e-;
int n,m,fl[N][N]/*,fu[N][N]*/,eh[N][N],el[N][N],cnt[N][N],tot;
db l,r,mid,ans,dis[N][N],w[N][N][];
bool vis[N][N];
queue<pair<int,int> > q;
bool spfa()
{
// printf("mid=%.3lf\n",mid);
while(q.size())q.pop();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
q.push(make_pair(i,j));
vis[i][j]=; dis[i][j]=; cnt[i][j]=;
if(i)
{
w[i][j][]=fl[i][j]-mid*el[i][j];
// if(mid<3&&mid>2&&el[i][j]==1)
// printf("w[%d][%d][0]=%.3lf\n",i,j,w[i][j][0]);
}
if(j)
{
w[i][j][]=/*-fu[i][j]*/-mid*eh[i][j];
// if(mid<3&&mid>2&&eh[i][j]==1)
// printf("w[%d][%d][1]=%.3lf\n",i,j,w[i][j][1]);
}
if(i<n)
{
w[i][j][]=-fl[i+][j]-mid*el[i+][j];
// if(mid<3&&mid>2&&el[i+1][j]==1)
// printf("w[%d][%d][3]=%.3lf\n",i,j,w[i][j][3]);
}
if(j<m)
{
w[i][j][]=/*fu[i][j+1]*/-mid*eh[i][j+];
// if(mid<3&&mid>2&&eh[i][j+1]==1)
// printf("w[%d][%d][2]=%.3lf\n",i,j,w[i][j][2]);
}
}
while(q.size())
{
int x=q.front().first,y=q.front().second;
q.pop();
vis[x][y]=;
// if(mid>2&&mid<3)printf("x=%d y=%d cnt=%d dis=%.3lf\n",x,y,cnt[x][y],dis[x][y]);
// if(mid>2&&mid<3)printf("fa[%d][%d]=(%d,%d)\n",x,y,fa[x][y][0],fa[x][y][1]);
if(x&&dis[x-][y]<dis[x][y]+w[x][y][])
{
dis[x-][y]=dis[x][y]+w[x][y][];
// printf(" w[%d][%d][0]=%.3lf\n",x,y,w[x][y][0]);
// fa[x-1][y][0]=x; fa[x-1][y][1]=y;
cnt[x-][y]=cnt[x][y]+;
if(cnt[x-][y]==tot)
{
// if(mid>2&&mid<3)
// printf("x-1=%d y=%d dis=%.3lf\n",x-1,y,dis[x-1][y]);
return ;
}
if(!vis[x-][y])
vis[x-][y]=,q.push(make_pair(x-,y));
}
if(y&&dis[x][y-]<dis[x][y]+w[x][y][])
{
dis[x][y-]=dis[x][y]+w[x][y][];
// printf(" w[%d][%d][1]=%.3lf\n",x,y,w[x][y][1]);
// fa[x][y-1][0]=x; fa[x][y-1][1]=y;
cnt[x][y-]=cnt[x][y]+;
if(cnt[x][y-]==tot)
{
// if(mid>2&&mid<3)
// printf("x=%d y-1=%d dis=%.3lf\n",x,y-1,dis[x][y-1]);
return ;
}
if(!vis[x][y-])
vis[x][y-]=,q.push(make_pair(x,y-));
}
if(x<n&&dis[x+][y]<dis[x][y]+w[x][y][])
{
dis[x+][y]=dis[x][y]+w[x][y][];
// printf(" w[%d][%d][3]=%.3lf\n",x,y,w[x][y][3]);
// fa[x+1][y][0]=x; fa[x+1][y][1]=y;
cnt[x+][y]=cnt[x][y]+;
if(cnt[x+][y]==tot)
{
// if(mid>2&&mid<3)
// printf("x+1=%d y=%d dis=%.3lf\n",x+1,y,dis[x+1][y]);
return ;
}
if(!vis[x+][y])
vis[x+][y]=,q.push(make_pair(x+,y));
}
if(y<m&&dis[x][y+]<dis[x][y]+w[x][y][])
{
dis[x][y+]=dis[x][y]+w[x][y][];
// printf(" w[%d][%d][2]=%.3lf\n",x,y,w[x][y][4]);
// fa[x][y+1][0]=x; fa[x][y+1][1]=y;
cnt[x][y+]=cnt[x][y]+;
if(cnt[x][y+]==tot)
{
// if(mid>2&&mid<3)
// printf("x=%d y+1=%d dis=%.3lf\n",x,y+1,dis[x][y+1]);
return ;
}
if(!vis[x][y+])
vis[x][y+]=,q.push(make_pair(x,y+));
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m); tot=(n+)*(m+);//+1!!!
for(int i=;i<=n;i++)
for(int j=,d;j<=m;j++)
{
scanf("%d",&d); r+=d;
fl[i][j]=fl[i][j-]+d;
// fu[i][j]=fu[i-1][j]+d;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&eh[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&el[i][j]);
while(r-l>eps)
{
mid=(l+r)/;
if(spfa()) ans=mid,l=mid+eps;
else r=mid-eps;
}
printf("%.3lf\n",ans);
return ;
}
bzoj 3232 圈地游戏——0/1分数规划(或网络流)的更多相关文章
- bzoj3232圈地游戏——0/1分数规划+差分建模+判环
Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到 ...
- bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...
- BZOJ 3232: 圈地游戏 分数规划+判负环
3232: 圈地游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 966 Solved: 466[Submit][Status][Discuss] ...
- bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 0/1分数规划裸题. #include<iostream> #includ ...
- 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像所有点连流量 ...
- Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
随机推荐
- Java 9 模块解耦的设计策略
1. 概述 Java 平台模块系统 (Java Platform Module System,JPMS)提供了更强的封装.更可靠且更好的关注点分离. 但所有的这些方便的功能都需要付出代价.由于模块化的 ...
- uva 11404 dp
UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[ ...
- 使用jquery改动表单的提交地址
基本思路: 通过使用jquery选择器得到相应表单的jquery对象,然后使用attr方法改动相应的action 演示样例程序一: 默认情况下,该表单会提交到page_one.html 点击butto ...
- dnSpy进行反编译修改并编译运行EXE或DLL
dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行 本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: h ...
- Android studio 混淆打包问题
参考 : Android Studio代码混淆设置以及上传mapping文件 AndroidStudio 混淆打包 在app 目录下 proguard-rules.pro中加入 通用 混淆 #指定代 ...
- asp.net 后台多线程异步处理时的 进度条实现一(Ajax+Ashx实现以及封装成控件的实现)
(更新:有的同学说源代码不想看,说明也不想看,只想要一个demo,这边提供一下:http://url.cn/LPT50k (密码:TPHU)) 工作好长时间了,这期间许多功能也写成了不少的控件来使用, ...
- 2015年多校联合训练第一场OO’s Sequence(hdu5288)
题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个相应的j使得a[i]%a[j]=0.那么l,r内有多少个i,f(l,r)就是几. 问全部f(l,r)的 ...
- T-SQL高级查询语句(父子查询)
T-SQL高级查询语句 高级查询 1.连接查询,对结果集列的扩展 select * from info select * from info,nation #形成笛卡尔积 select * from ...
- FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程(转)
很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序也能继续运行.这是因为对MCU烧写固件 的实质就是将程序固件写入到M ...
- 最近两周我们接触到的两种线上抓娃娃机的技术实现方案(一种RTSP/一种RTMP)
线上抓娃娃机需求 最近线上抓娃娃机的项目火爆了,陆陆续续几十款线上抓娃娃机上架,还有一大波正在开发上线中,各大视频云提供商都在蹭热度发布自己的线上抓娃娃机方案,综合了一下,目前线上抓娃娃机的视频需求无 ...