题目: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=55,M=N*N;
const db eps=1e-7;
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][5];
bool vis[N][N];
queue<pair<int,int> > q;
bool spfa()
{
//    printf("mid=%.3lf\n",mid);while(q.size())q.pop();for(int i=0;i<=n;i++)for(int j=0;j<=m;j++){q.push(make_pair(i,j));vis[i][j]=1; dis[i][j]=0; cnt[i][j]=0;if(i){w[i][j][0]=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][1]=/*-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][3]=-fl[i+1][j]-mid*el[i+1][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][2]=/*fu[i][j+1]*/-mid*eh[i][j+1];
//                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]=0;
//        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-1][y]<dis[x][y]+w[x][y][0]){dis[x-1][y]=dis[x][y]+w[x][y][0];
//            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-1][y]=cnt[x][y]+1;if(cnt[x-1][y]==tot){
//                if(mid>2&&mid<3)
//                    printf("x-1=%d y=%d dis=%.3lf\n",x-1,y,dis[x-1][y]);return 1;}if(!vis[x-1][y])vis[x-1][y]=1,q.push(make_pair(x-1,y));}if(y&&dis[x][y-1]<dis[x][y]+w[x][y][1]){dis[x][y-1]=dis[x][y]+w[x][y][1];
//            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-1]=cnt[x][y]+1;if(cnt[x][y-1]==tot){
//                if(mid>2&&mid<3)
//                    printf("x=%d y-1=%d dis=%.3lf\n",x,y-1,dis[x][y-1]);return 1;}if(!vis[x][y-1])vis[x][y-1]=1,q.push(make_pair(x,y-1));}if(x<n&&dis[x+1][y]<dis[x][y]+w[x][y][3]){dis[x+1][y]=dis[x][y]+w[x][y][3];
//            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+1][y]=cnt[x][y]+1;if(cnt[x+1][y]==tot){
//                if(mid>2&&mid<3)
//                    printf("x+1=%d y=%d dis=%.3lf\n",x+1,y,dis[x+1][y]);return 1;}if(!vis[x+1][y])vis[x+1][y]=1,q.push(make_pair(x+1,y));}if(y<m&&dis[x][y+1]<dis[x][y]+w[x][y][2]){dis[x][y+1]=dis[x][y]+w[x][y][2];
//            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+1]=cnt[x][y]+1;if(cnt[x][y+1]==tot){
//                if(mid>2&&mid<3)
//                    printf("x=%d y+1=%d dis=%.3lf\n",x,y+1,dis[x][y+1]);return 1;}if(!vis[x][y+1])vis[x][y+1]=1,q.push(make_pair(x,y+1));}}return 0;
}
int main()
{scanf("%d%d",&n,&m); tot=(n+1)*(m+1);//+1!!!for(int i=1;i<=n;i++)for(int j=1,d;j<=m;j++){scanf("%d",&d); r+=d;fl[i][j]=fl[i][j-1]+d;
//            fu[i][j]=fu[i-1][j]+d;
        }for(int i=0;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&eh[i][j]);for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)scanf("%d",&el[i][j]);while(r-l>eps){mid=(l+r)/2;if(spfa()) ans=mid,l=mid+eps;else r=mid-eps;}printf("%.3lf\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/9709181.html

bzoj 3232 圈地游戏——0/1分数规划(或网络流)相关推荐

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

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

  2. bzoj 3232: 圈地游戏

    学过的知识早忘了,不会写,又怕写错,果断转载:CQzhangyu code: #include<cstdio> #include<cstdlib> #include<cs ...

  3. [学习笔记]0/1分数规划

    对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...

  4. 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环

    首页 新随笔 联系 管理 订阅 随笔- 20  文章- 0  评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...

  5. jzoj4017-逃跑【0/1分数规划,线段树,dp】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3011/2 题目大意 n+1n+1n+1个连续的地方,每个地方有(a,b,c)(a,b,c)(a,b,c) ...

  6. jzoj3852-单词接龙【0/1分数规划,负环】

    正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...

  7. #0/1分数规划,SPFA,负环#洛谷 1768 天路

    题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...

  8. POJ2976——Dropping tests(0/1分数规划)

    传送门 最简单的分数规划 对于最终答案ans,有 ans=Σai∗100Σbians=\frac{Σa_i*100}{Σb_i}ans=Σbi​Σai​∗100​ 则 Σbi∗ans=Σai∗100Σ ...

  9. [JSOI2016] 最佳团体(0/1分数规划 + 树形dp)

    problem luogu-P4322 solution 假设每个人是否被招募,用 xi={0,1}x_i=\{0,1\}xi​={0,1} 代替,max⁡∑pi∗xi∑si∗xi\max\frac{ ...

最新文章

  1. 【只需4步】windows server系统下快速安装绿色版apache-tomcat-8.0.35(免安装版)
  2. 电动汽车驱动电机及其控制系统
  3. python读取浮点数与源文件不同
  4. 机器学习实战读书笔记--决策树
  5. Java 理论与实践: 非阻塞算法简介--转载
  6. python算发必须有输出吗_数据时代为什么一定要学python+算法?
  7. 【转载】SAP参数文件简介
  8. 服务器系统杀毒系统崩溃怎么恢复,系统崩溃是什么原因导致的
  9. STM32系列芯片名称定义
  10. 在 LaTeX 中插入表格
  11. MySQL的可重复读、幻读及实现原理
  12. EXCEL workbook.saveas 函数详解
  13. 时域反射仪(TDR)介绍
  14. vue 怎么销毁dom_Vue 中如何转移 Dom ?
  15. 基于微信小程序的图书馆管理系统设计与实现(论文+程序设计源码+数据库文件)
  16. 什么样的恐怖才是真恐怖?由最近所看的一部电影以及最喜欢的游戏系列想到的。
  17. Fuchsia源码分析--系统调用流程
  18. PHP 判断链表是否相交
  19. 数据存储计量单位换算
  20. 【LTspice】【如何手动测量仿真波形的电压(差)值】

热门文章

  1. 2018python培训-2018年5月python自动化运维开发课程新班正式开课!
  2. python3.6安装scrapy-python3.6 安装scrapy
  3. python编程需要什么软件-《》 学习python编程需要安装哪些软件?
  4. python课程将主要介绍哪些内容-Python课程详细介绍
  5. python3下载教程-Python3 教程
  6. python里面temp是啥-python temp file:如何打开多次临时文件?
  7. python程序打包成exe可执行文件,亲测可行(pyinstaller教程)
  8. lua学习笔记之日期时间
  9. spring中mvc的跨域访问
  10. guava之ComparisonChain