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 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
随机推荐
- 常规轮询请求,客户端用Ajax调webservice的方法
服务端发布webservice,下图方框中的一定要有 客户端代码 <script type="text/javascript"> $(document).ready(f ...
- webview 中 svg的坑
在这里不会详细介绍如何绘制svg图片,是讲一个很小的bug,看图 在这张图中,上面带有纹理和弧度的图片,原本是直接切了一张png的图片,但是由于是在app的登录注册的首页,那么这个35k的图片就会非常 ...
- 学习c语言的第9天
#include <stdio.h> int main() { float sum=0,wage=0; int i=1; int num; printf("+++平均工资统计程序 ...
- 最新hosts,更新hosts,可用
点击这里,全选后复制,粘贴到C:\Windows\System32\drivers\etc的hosts里面,把原来的置换了
- 【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)
关键字: MemoryStream.WMP.WindowsMediaPlayer.Play .Load. Delphi.C++.C#.ActiveX控件 作 者: CaiBirdy 问 题:正常使 ...
- 西门子MES解决方案SIMATIC IT在乳制品行业小试牛刀
竞争的白热化,紧缩的产品利润,食品安全保障,越来越苛刻的法规要求和全球化的市场与品牌维持的重要性对乳品行业的企业提出了更高的要求,实施 MES将是企业唯一的出路. 自从“十一五”制造业信息化为MES正 ...
- Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫
摘要:根据Excel文件配置运行多个爬虫 很多时候,我们都需要为每一个单独的网站编写一个爬虫,但有一些情况是你要爬取的几个网站的唯一不同之处在于Xpath表达式不同,此时要分别为每一个网站编写一个爬虫 ...
- virtualenv 安装
virtualenv 是一个创建隔离的Python环境的工具. virtualenv要解决的根本问题是库的版本和依赖,以及权限问题.假设你有一个程序,需要LibFoo的版本1,而另一个程序需要版本2, ...
- 学习XML总结
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分. 元素可包含其他元素.文本或者两者的混合物.元素也可以拥有属性. xml包含如下: 元素 文本 属性 元素 命名: 名称可以含字母. ...
- hdu 2425 Hiking Trip
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2425 Hiking Trip Description Hiking in the mountains ...