$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 ;
}
随机推荐
- 「BZOJ1005」[HNOI2008] 明明的烦恼
「BZOJ1005」[HNOI2008] 明明的烦恼 先放几个prufer序列的结论: Prufer序列是一种对有标号无根树的编码,长度为节点数-2. 具体存在无根树转化为prufer序列和prufe ...
- 【codeforces 777E】Hanoi Factory
[题目链接]:http://codeforces.com/problemset/problem/777/E [题意] 让你摆汉诺塔片; 要求在上面的片的外圈大于在下面的片的内圈,且小于下面的片的外圈; ...
- hdu 5656 CA Loves GCD
CA Loves GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- 洛谷P4860 Roy&October之取石子II 题解 博弈论
题目链接:https://www.luogu.org/problem/P4860 和<P4018 Roy&October之取石子>一样的推导思路,去找循环节. 可以发现:只要不能被 ...
- Pytorch Bi-LSTM + CRF 代码详解
久闻LSTM + CRF的效果强大,最近在看Pytorch官网文档的时候,看到了这段代码,前前后后查了很多资料,终于把代码弄懂了.我希望在后来人看这段代码的时候,直接就看我的博客就能完全弄懂这段代码. ...
- SpringBoot2.0--- 多数据源配置
在开发的过程中我们可能都会遇到对接公司其他系统等需求,对于外部的系统可以采用接口对接的方式,对于一个公司开发的两个系统,并且知道相关数据库结构的情况下,就可以考虑使用多数据源来解决这个问题.Spr ...
- squid+iptables实现网关防火墙
需求说明:此服务器用作网关.MAIL(开启web.smtp.pop3).FTP.DHCP服务器,内部一台机器(192.168.0.254)对外提供dns服务,为了不让无意者轻易看出此服务器开启了ssh ...
- win10 uwp 依赖属性
本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用. 本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用 在 UWP 和 wpf ,如果需要创建自己的依赖属性,可以使用代码片,在 ...
- Vue 语法的一些小问题
设置 sty行内样式 :style="{width:mapWidth,height:mapHeight}" This指向 axios 使用axios 的时候 ,在生命周期函数 ...
- 51nod1327 棋盘游戏
远古大坑 神仙DP状态设计题 https://blog.csdn.net/white_elephant/article/details/83592103 从行的角度入手,无论如何都要状压 每列最多放一 ...