bzoj 3232 01分数规划+最大权封闭子图判定
我们的目标是使v/c最小化,所以构造函数g(x)=v-x*c,那么
二分一个X,判断当时的v-x*c的值是多少,然后根据g(x)函数的
单调递减性来二分,判断,直到g(x)=0的时候当前的X就是答案。
然后我直接写的tle了,这是这两天tle的第3道题了。。。再改改。。。
/**************************************************************
Problem: 3232
User: BLADEVIL
Language: Pascal
Result: Time_Limit_Exceed
****************************************************************/
//By BLADEVIL
const
lim =1e-5;
var
n, m :longint;
pre, other :array[0..100010] of longint;
len :array[0..100010] of extended;
last :array[0..3010] of longint;
tot :longint;
num :array[0..60,0..60] of longint;
key, heng, shu :array[0..60,0..60] of longint;
sum :longint;
print :extended;
que, d :array[0..3010] of longint;
source, sink :longint;
function min(a,b:extended):extended;
begin
if a>b then min:=b else min:=a;
end;
function judge(x:extended):extended;
begin
if abs(x)<lim then exit(0);
if x<0 then exit(-1) else exit(1);
end;
procedure connect(x,y:longint;z:extended);
begin
inc(tot);
pre[tot]:=last[x];
last[x]:=tot;
other[tot]:=y;
len[tot]:=z;
end;
procedure init;
var
i, j :longint;
begin
read(n,m);
for i:=1 to n do
for j:=1 to m do num[i,j]:=(i-1)*m+j;
for i:=1 to n do
for j:=1 to m do
begin
read(key[i,j]);
sum:=sum+key[i,j];
end;
for i:=1 to n+1 do
for j:=1 to m do read(heng[i,j]);
for i:=1 to n do
for j:=1 to m+1 do read(shu[i,j]);
source:=num[n,m]+2;
sink:=source+1;
end;
function bfs:boolean;
var
q, p :longint;
h, t, cur :longint;
begin
fillchar(d,sizeof(d),0);
d[source]:=1;
h:=0; t:=1; que[1]:=source;
while h<t do
begin
inc(h);
cur:=que[h];
q:=last[cur];
while q<>0 do
begin
p:=other[q];
if (judge(len[q])>0) and (d[p]=0) then
begin
inc(t);
que[t]:=p;
d[p]:=d[cur]+1;
if p=sink then exit(true);
end;
q:=pre[q];
end;
end;
exit(false);
end;
function dinic(x:longint;flow:extended):extended;
var
rest, tmp :extended;
q, p :longint;
begin
if x=sink then exit(flow);
rest:=flow;
q:=last[x];
while q<>0 do
begin
p:=other[q];
if (judge(len[q])>0) and (d[p]=d[x]+1) and (rest>0) then
begin
tmp:=dinic(p,min(rest,len[q]));
rest:=rest-tmp;
len[q]:=len[q]-tmp;
len[q xor 1]:=len[q xor 1]+tmp;
end;
q:=pre[q];
end;
exit(flow-rest);
end;
procedure main;
var
l, r, mid :extended;
cur :longint;
ans :extended;
i, j :longint;
begin
l:=0; r:=90;
while r-l>lim do
begin
mid:=(l+r)/2;
fillchar(last,sizeof(last),0);
tot:=1;
for i:=1 to n do
for j:=1 to m do
begin
connect(source,num[i,j],key[i,j]);
connect(num[i,j],source,0);
end;
for i:=1 to n do
for j:=1 to m do
begin
cur:=0;
if i=1 then inc(cur,heng[i,j]);
if i=n then inc(cur,heng[i+1,j]);
if j=1 then inc(cur,shu[i,j]);
if j=m then inc(cur,shu[i,j+1]);
if cur>0 then
begin
connect(num[i,j],sink,cur*mid);
connect(sink,num[i,j],0);
end;
end;
for i:=1 to n-1 do
for j:=1 to m do
begin
connect(num[i,j],num[i+1,j],heng[i+1,j]*mid);
connect(num[i+1,j],num[i,j],heng[i+1,j]*mid);
end;
for i:=1 to n do
for j:=1 to m-1 do
begin
connect(num[i,j],num[i,j+1],shu[i,j+1]*mid);
connect(num[i,j+1],num[i,j],shu[i,j+1]*mid);
end;
ans:=0;
while bfs do
ans:=ans+dinic(source,maxlongint);
if judge(sum-ans)>0 then l:=mid else r:=mid;
end;
writeln(l:0:3);
end;
begin
init;
main;
end.
bzoj 3232 01分数规划+最大权封闭子图判定的更多相关文章
- 2018.11.06 NOIP训练 最大获利(profit)(01分数规划+最大权闭合子图)
传送门 好题啊. ∑i<jpi,jK∗(200−K)>X\frac{\sum_{i<j}p_{i,j}}{K*(200-K)}>XK∗(200−K)∑i<jpi,j ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
BZOJ 最大密度子图. 二分答案\(x\),转为求是否存在方案满足:\(边数-x*点数\geq 0\). 选一条边就必须选两个点,所以可以转成最大权闭合子图.边有\(1\)的正权,点有\(x\)的负 ...
- bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- 【bzoj 3232】圈地游戏(算法效率--01分数规划+图论--最小割)
题目:DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用.DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走 ...
- BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)
题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...
- 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
[题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...
随机推荐
- DataGridView 控件用法(可能不是很全面,因为这是自己常常用到的一些小总结):
一.DataGridView属性设置 1.我们单击选中行的时候,默认是选择一个单元格,不能选择一整行,我们只需设置DataGridView的属性SelectionMode为FullRowSelect ...
- 史上最全Vim快捷键键位图(入门到进阶)
经典版 下面这个键位图应该是大家最常看见的经典版了. 对应的简体中文版 其实经典版是一系列的入门教程键位图的组合结果,下面是不同编辑模式下的键位图. 入门版 基本操作的入门版. 进阶版 增强版 下图是 ...
- php数组去重复代码
php数组去重复数据示例,有时候获得的php数组中总是出现value重复的,使用下面的方法就可以去掉重复数据 以数字开头的重复数据如: Array ( [0] => 100 [k1] =&g ...
- delphi的几个特别关键字 object absolute
1.object关键字相当于C++中的struct, record定义个结构体只能定义数据,而object可以定义方法,默认都是public的. 代码示例如下: TTest = record na ...
- 射击比赛 (POJ 1719) 题解
[问题描述] 我们假设射击的目标是一个由R*C(2≤R≤C≤ 1000)个小方格组成的矩形网格.网格中每一列恰有2个白色的小方格和R-2个黑色的小方格.定义网格的行从顶至底编号为1~R,列从左至右编号 ...
- Java 第六天 Spring Annotation 和其它
Annotation,是Java语言中的一种特殊的元数据语法,Spring支持使用annotation来进行对象实例化和装配 使用Annotation在Spring的配置xml中添加context命名 ...
- python实现决策树
1.决策树的简介 http://www.cnblogs.com/lufangtao/archive/2013/05/30/3103588.html 2.决策是实现的伪代码 “读入训练数据” “找出每个 ...
- ok6410的LCD裸机范例
/****************************************** 实验步骤 1.配置引脚功能,将其GPI.GPJ引脚设置为VD数据输出模式,及GPJ后几位设置成LCD时钟输出: ...
- ok6410的madplay配置
二.移植嵌入式播放器 madplay madplay 播放器程序主要依赖于如下库: zlib zlib-1.1.4.tar.gz 提供数据压缩用的函式库 libid3tag libid3tag- ...
- python 上下文管理器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...