bzoj 1565 最大权闭合子图
然后因为成环的点肯定不会被毁掉,所以直接删了,可以由拓扑排序得出,可以提高速度
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Time_Limit_Exceed
****************************************************************/
//By BLADEVIL
var
n, m :longint;
num :array[..,..] of longint;
key :array[..,..] of longint;
sum :array[..] of longint;
flag :array[..] of boolean;
que :array[..] of longint;
other, len, pre, succ :array[..] of longint;
l :longint;
last :array[..] of longint;
source, sink :longint;
ans :longint;
d :array[..] of longint;
function min(a,b:longint):longint;
begin
if a>b then min:=b else min:=a;
end;
procedure connect(x,y,z:longint);
begin
inc(l);
pre[l]:=last[x];
succ[pre[l]]:=l;
last[x]:=l;
other[l]:=y;
len[l]:=z;
end;
procedure topo_sort;
var
h, t, q, p :longint;
i :longint;
cur :longint;
begin
h:=; t:=;
for i:= to num[n-,m-] do
if sum[i]= then
begin
inc(t);
que[t]:=i;
end;
while h<t do
begin
inc(h);
cur:=que[h];
q:=last[cur];
flag[cur]:=true;
while q<> do
begin
p:=other[q];
if len[q]= then
begin
dec(sum[p]);
if sum[p]= then
begin
inc(t);
que[t]:=p;
end;
end;
q:=pre[q];
end;
end;
end;
procedure init;
var
i, j, k :longint;
x, y, cur :longint;
q, p :longint;
begin
read(n,m);l:=;
for i:= to n- do
for j:= to m- do
num[i,j]:=i*m+j+;
for i:= to n- do
for j:= to m- do
begin
read(key[i,j]);
read(cur);
for k:= to cur do
begin
read(x,y);
connect(num[i,j],num[x,y],);
inc(sum[num[x,y]]);
connect(num[x,y],num[i,j],maxlongint);
end;
end;
for i:= to n- do
for j:= to m- do
begin
connect(num[i,j],num[i,j-],);
inc(sum[num[i,j-]]);
connect(num[i,j-],num[i,j],maxlongint);
end;
topo_sort;
for i:= to num[n-,m-] do
if not flag[i] then
begin
q:=last[i];
while q<> do
begin
p:=q xor ;
if succ[p]<> then pre[succ[p]]:=pre[p];
succ[pre[p]]:=succ[p];
q:=pre[q];
end;
end;
end;
function bfs:boolean;
var
q, p :longint;
h, t :longint;
cur :longint;
begin
fillchar(d,sizeof(d),);
h:=; t:=;
d[source]:=;
que[]:=source;
while h<t do
begin
inc(h);
cur:=que[h];
q:=last[cur];
while q<> do
begin
p:=other[q];
if (flag[p]) and (len[q]>) and (d[p]=) then
begin
inc(t);
que[t]:=p;
d[p]:=d[cur]+;
if p=sink then exit(true);
end;
q:=pre[q];
end;
end;
exit(false);
end;
function dinic(x,flow:longint):longint;
var
q, p :longint;
tmp, rest :longint;
begin
if x=sink then exit(flow);
rest:=flow;
q:=last[x];
while q<> do
begin
p:=other[q];
if (len[q]>) and (flag[p]) and (d[x]+=d[p]) and (rest>) then
begin
tmp:=dinic(p,min(rest,len[q]));
dec(rest,tmp);
dec(len[q],tmp);
inc(len[q xor ],tmp);
end;
q:=pre[q];
end;
exit(flow-rest);
end;
procedure main;
var
i, j :longint;
begin
source:=num[n-,m-]+; sink:=source+;
for i:= to n- do
for j:= to m- do
if flag[num[i,j]] then
if key[i,j]> then
begin
inc(ans,key[i,j]);
connect(source,num[i,j],key[i,j]);
connect(num[i,j],source,);
end else
begin
connect(num[i,j],sink,-key[i,j]);
connect(sink,num[i,j],);
end;
flag[sink]:=true; flag[source]:=true;
while bfs do ans:=ans-dinic(source,maxlongint);
if ans> then writeln(ans) else writeln();
end;
begin
init;
main;
end.
bzoj 1565 最大权闭合子图的更多相关文章
- bzoj 1497(最大权闭合子图)
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6410 Solved: 3099[Submit][Status] ...
- BZOJ 1565 NOI2009 植物大战僵尸 topo+最小割(最大权闭合子图)
题目链接:https://www.luogu.org/problemnew/show/P2805(bzoj那个实在是有点小小的辣眼睛...我就把洛谷的丢出来吧...) 题意概述:给出一张有向图,这张有 ...
- BZOJ 1565 / P2805 [NOI2009]植物大战僵尸 (最大权闭合子图 最小割)
题意 自己看吧 BZOJ传送门 分析 - 这道题其实就是一些点,存在一些二元限制条件,即如果要选uuu则必须选vvv.求得到的权值最大是多少. 建一个图,如果选uuu必须选vvv,则uuu向vvv连边 ...
- BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)
图中的保护关系就类似于最大权闭合子图.即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边.那么题目就转化成了最大权闭合子图的问题. 但是这个图有点特殊啊... 考虑有环的情况,显然这个环以 ...
- bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...
- BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流
题意: 植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: (1)价值: (2)保护集合,也就是这个植物可以保护矩阵中的某些格子. 现在你是僵尸,你每次只能从(i,m) 格子 ...
- BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
BZOJ 最大密度子图. 二分答案\(x\),转为求是否存在方案满足:\(边数-x*点数\geq 0\). 选一条边就必须选两个点,所以可以转成最大权闭合子图.边有\(1\)的正权,点有\(x\)的负 ...
- BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
随机推荐
- IOS中UIKit——UIButton的背景图像无法正常显示的原因
主要是在将图像引入项目中,没有选择Destination:Copy items if needed一项. 没有选择Destination:Copy items if needed一项,图像只能是以链接 ...
- Thinking about think-time functions
You will find yourself very familier to this topic. Ok, let me ask you one question: Let me know th ...
- 深入浅出MongoDB(三)环境搭建
上次的博文深入浅出MongoDB(二)概述中我们已经将MongoDB的相关概念讲解了一下,接下来我们继续进行MongoDB学习.在学习之前,大家首先需要在自己的电脑上安装MongoDB. 1.安装 安 ...
- 安装pdo.so和pdo_mysql.so还有pcntl.so扩展到php中
1.下载源码,解压tar -xzvf php-5.4.20.tar.gz cd /usr/local/src/php-5.4.20/ext/pdo /usr/local/php/bin/phpize ...
- Laravel 5 基础(十一)- 子视图和表单复用
我们需要处理编辑文章的问题.当然我们可以手工添加新的路由,就像这样: Route::get('/articles/{id}/edit', 'ArticleController@edit'); 让我们在 ...
- javascript arguments
此文为转载文章: 什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments ...
- 7.python字符串-内置方法分析
上篇对python中的字符串内置方法进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法按照其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -& ...
- move和转发
总的来说C++09跟C++98相比的变化是极其重大的.这个变化体现在三个方面,一个是形式上的变化,即在编码形式层面的支持,也就是对应我们所谓的编程范式(paradigm).C++09不会引入新的编程范 ...
- 算法系列7《CVN》
计算CVN时使用二个64位的验证密钥,KeyA和KeyB. 1) 计算CVN 的数据源包括: 主账号(PAN).卡失效期和服务代码,从左至右顺序编排. 4123456789012345+8701+11 ...
- iOS学习之C语言指针
访问数据的两种方式: 1.直接访问: 2.间接访问:先找到内存地址,根据地址访问存储单元.(内存地址 被称为指针) 定义指针变量: 类型修饰符 *指针变量名 = NULL; NULL表示空指针,相当 ...