正解:最小割+01分数规划

解题报告:

传送门$QwQ$

感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤

首先看到这个分数形式,又说是最大值,显然考虑01分数规划呗?然后就考虑怎么$check$?

先更新下每条边的权值变成了$ed_{val}\cdot mid$,然后现在就要算$\sum ed_{val}-\sum nod_{val}$

然后再考虑下什么样的边会被计入?就如果一条边的一边格子被选了另一边没被选就会被计入答案嘛$QwQ$

这时候就会$jio$得有点儿像最小割辣,,,?就是减法,然后又有一定的彼此之间滴制约关系啥的

然后我开始想到这儿就$jio$得,黑白染色然后黑色建一排白色建一排相邻格子之间连边然后就做完辣$QwQ$?

仔细一想发现布星,因为这样并不能保证只围出了一个圈,,,不能作出约束$QwQ$

于是考虑再换一种建边方式?发现上面的问题在于没有对不能选的点作出约束,所以显然所有点要放一排$QwQ$

欧克这样显然可以满足关于点的需求了,但是依然要考虑关于边的条件$QwQ$

考虑相邻格子之间连流量为边权的双向边,保证如果两个点中如果相邻俩格子一个选了一个没选就必须把这条边的边权也割了$QwQ$

然后还有就所有边界上的点都要和$T$连一条流量为边界边权的边,这个挺显然?因为如果选了这个点一定是要付出边权的代价的鸭$QwQ$

然后就跑个最小割就成$QwQ$

如果实在无法理解建图的可以自己画下图,,,说实话这个建图方法我也麻油想到,我看了题解之后自己画了个图才$get$的,,,$QwQ$

$over$

最后我一定要感谢这道题,,,它让我意识到我滴二分+网络流一定有问题,,,(我连$T$三道二分+网络流就是找不到错我还以为是我常数太大嘤,,,

港下问题在哪儿$QwQ$?就,$bfs,dfs,dinic$中判断$\neq 0$改成判断$>eps$,$over$

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define lf double
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define n(i) edge[i].nxt
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(int i=x;i<=y;++i)
#define my(i,x,y) for(int i=x;i>=y;--i)
#define e(i,x) for(int i=head[x];~i;i=n(i)) const int N=1e4+,M=;
const lf eps=1e-,inf=1e9;
int n,m,dep[N],head[N],cur[N],S,T,ed_cnt=-,val[M][M],h[M][M],s[M][M];
lf l,r=,sum;
struct ed{int to,nxt;lf wei;}edge[N<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int nam(ri x,ri y){return (x-)*m+y;}
il void ad(ri x,ri y,lf z)
{
//printf("%d -> %d : %.3lf\n",y,x,z);
edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty())
{ri nw=Q.front();Q.pop();e(i,nw)if(w(i)>eps && !dep[t(i)]){dep[t(i)]=dep[nw]+,Q.push(t(i));if(t(i)==T)return ;}}
return ;
}
lf dfs(ri nw,lf flow)
{
if(nw==T || flow<eps)return flow;lf ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i)>eps && dep[t(i)]==dep[nw]+)
{lf tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;}
if(ret<eps)dep[nw]=;
return ret;
}
il lf dinic(){lf ret=;while(bfs()){rp(i,S,T)cur[i]=head[i];while(){lf d=dfs(S,inf);ret+=d;if(d<=eps)break;}}return ret;}
il bool check(lf mid)
{
memset(head,-,sizeof(head));ed_cnt=-;
rp(i,,n)rp(j,,m)ad(nam(i,j),S,val[i][j]);
rp(i,,n-)rp(j,,m)ad(nam(i+,j),nam(i,j),mid*h[i][j]),ad(nam(i,j),nam(i+,j),mid*h[i][j]);
rp(i,,n)rp(j,,m-)ad(nam(i,j),nam(i,j+),mid*s[i][j]),ad(nam(i,j+),nam(i,j),mid*s[i][j]);
rp(i,,m)ad(T,nam(,i),mid*h[][i]),ad(T,nam(n,i),mid*h[n][i]);//,printf("QwQ mid=%lf h=%d h=%d\n",mid,h[0][i],h[n][i]);
rp(i,,n)ad(T,nam(i,),mid*s[i][]),ad(T,nam(i,m),mid*s[i][m]);//,printf("QwQQ mid=%lf s=%d s=%d\n",mid,s[i][0],s[i][m]);
lf tmp=dinic();
//printf("mid=%.3lf sum=%lf dinic()=%.3lf\n",mid,sum,tmp);
return abs(sum-tmp)>eps;
} int main()
{
//freopen("3232.in","r",stdin);freopen("3232.out","w",stdout);
n=read();m=read();S=;T=n*m+;
rp(i,,n)rp(j,,m)sum+=(val[i][j]=read());rp(i,,n)rp(j,,m)h[i][j]=read();rp(i,,n)rp(j,,m)s[i][j]=read();
while(r-l>eps){lf mid=(l+r)/;if(check(mid))l=mid;else r=mid;}
printf("%.3lf\n",r);
return ;
}

随机推荐

  1. jQuery 无刷新评论

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 2019-2-2-VisualStudio-扩展开发-添加菜单

    title author date CreateTime categories VisualStudio 扩展开发 添加菜单 lindexi 2019-02-02 15:35:18 +0800 201 ...

  3. Python深入:super函数

    新式类中最酷的,或者也是最不平常的特性之一,可能就是编写“cooperative类”.‘cooperative类’通过多继承,使用我称之为‘cooperative super call’的模式. 先来 ...

  4. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台

    支付宝小程序-MQTT模拟器通过WSS接入阿里云IoT物联网平台 小程序效果: 1. 准备工作 1.1 注册阿里云账号 开通阿里云账号,并通过支付宝实名认证 https://www.aliyun.co ...

  5. java文件操作 之 创建文件夹路径和新文件

    一:问题 (1)java 的如果文件夹路径不存在,先创建: (2)如果文件名 的文件不存在,先创建再读写;存在的话直接追加写,关键字true表示追加 (3)File myPath = new File ...

  6. xml path 列转行实例

    SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...

  7. Git上传本地项目到码云

    前提:本地安装git.注册码云 1.进入本地项目文件夹,鼠标右键代开 Git Bash Here 2.输入命令 初始化库管理文件 git init 3.输入命名 修改Git的全局配置 git conf ...

  8. JVM基础--JVM参数之堆栈空间配置

    目录 堆配置 年轻代 Eden区 永久代(JDK1.7) 元空间(JDK1.8) 栈空间 直接内存 总结 参考资料 JVM系列目录 JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问 ...

  9. html2canvas生成图片报错处理办法

    详见大佬博客链接: link.(https://www.jianshu.com/p/22bd5b98e38a) 需要注意的是要生成的网页中带的网络图片地址(如放在阿里云服务器图库的图片)经常有跨域报错 ...

  10. Python涉及的各个领域以及技术应用

    WEB开发 完全主义者高效率框架Django 异步高并发Tornado框架 短小精悍Flask,Bottle框架 网络编程 高并发Twisted网络框架 Python3引入的asyncio异步编程 爬 ...