题目: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分数规划(或网络流)的更多相关文章

  1. bzoj3232圈地游戏——0/1分数规划+差分建模+判环

    Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到 ...

  2. bzoj 3232: 圈地游戏

    bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...

  3. BZOJ 3232: 圈地游戏 分数规划+判负环

    3232: 圈地游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 966  Solved: 466[Submit][Status][Discuss] ...

  4. bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 0/1分数规划裸题. #include<iostream> #includ ...

  5. bzoj 3232: 圈地游戏 01分数规划

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...

  6. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  7. bzoj 3232: 圈地游戏【分数规划+最小割】

    数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...

  8. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

  9. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

随机推荐

  1. Oracle:创建存储过程

    1.无参存储过程 create or replace procedure test_procasv_total number(10);begin  select count(*) into v_tot ...

  2. smokeping插件使用及说明

    smokeping七大组件:general(普通设置) .alerts(警报设置).Datebase(数据库参数).presentation(网络自定义).slaves(从smokeping定义).t ...

  3. 07 redi sorder set结构及命令详解

    zadd key score1 value1 score2 value2 .. 添加元素 redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lil ...

  4. OpenCV 中的三大数据类型:CvMat 类型

    前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...

  5. PHP CURL 中文说明

    1.CURL是利用URL语法在命令行方式下工作的开源文件传输工具. 2.它被广泛应用在Unix.多种Linux发行版中.而且有DOS和Win32.Win64下的移植版本号. 3.它支持非常多协议:FT ...

  6. Project Structure 讲解(转)

    项目的左侧面板 项目设置->Project Project Settings -> Modules Sources面板 Paths面板 dependencies面板 Project Set ...

  7. Netty Bootstrap(图解)|秒懂

    目录 Netty Bootstrap(图解) 源码工程 写在前面 图解几个重要概念 父子 channel EventLoop 线程与线程组 通道与Reactor线程组 Channel 通道的类型 启动 ...

  8. Android笔记之ViewModel的使用示例

    依赖 implementation 'android.arch.lifecycle:extensions:1.1.1' implementation 'com.squareup.retrofit2:r ...

  9. var foo = "11"+2+"1"; console.log(foo); //1121 好多文章答案写错了,我发下给初学的朋友看到,以免一开始就学错了

    体会加一个字符串'1' 和 减去一个字符串'1'的不同 var foo = "11"+2-"1"; console.log(foo); //111 consol ...

  10. Discuz!支持发布视频帖子设定 + 修改后台文件

    最近想做一个地方性论坛,果断在阿里巴巴的phpwind论坛程序与腾讯旗下的discuz论坛程序中选择,虽然phpwind大气,后面还是 决定选择了discuz程序用来构建这个平台,经过一番安装后,发现 ...