$BZOJ3232$ 圈地游戏 网络流
正解:最小割+01分数规划
解题报告:
感$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 ;
}
随机推荐
- LeetCode70 Climbing Stairs
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- linux之docker
简介 Docker是一个开源的应用容器引擎,基于go语言,遵循从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的linux ...
- @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3
目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...
- 5、nginx配置
1.安装 sudo apt-get install nginx 2.启用 sudo service nginx start 3.若要将 Nginx 配置为转发请求向 ASP.NET Core 应用程序 ...
- @codeforces - 708D@ Incorrect Flow
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...
- @bzoj - 4379@ [POI2015] Modernizacja autostrady
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵无根树,边权都是1,请去掉一条边并加上一条新边,定义直径 ...
- PHP实现购物车的思路和源码分析
正文内容 这里主要是记录下自己的购物车的思路,具体功能实现,但是尚未在实际项目中用到,不对之处欢迎指正 项目中需要添加购物车. 目录说明 buy.php 点击购买之后的操作 car.php 购物车,显 ...
- oracle强制索引失效
如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) . 举例: SELECT ENAME FROM EMP WHERE EMPNO = 79 ...
- oracle等式比较和范围比较
当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较. 举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME FROM ...
- HDU1711 Number Sequence 题解 KMP算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题目大意:最基础的字符串匹配,只不过这里用整数数组代替了字符串. 给你两个数组 \(a[1..N ...