因为每个植物都有保护的点(每排相邻的右面的算是保护左面的),所以连他和保护
的点一条边,然后每个点有自己的权值,要找到最大的权值且满足每个点在访问时他
的前驱一定被访问,那么反向建边,转化为后继必须访问,即求一个
最大权闭合子图,然后转化为网络流最小割模型求解。。
然后因为成环的点肯定不会被毁掉,所以直接删了,可以由拓扑排序得出,可以提高速度
然后我还是tle了。。。有个480A的码,明儿看看啥意思吧。。。
  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Time_Limit_Exceed
  6. ****************************************************************/
  7.  
  8. //By BLADEVIL
  9. var
  10.     n, m                        :longint;
  11.     num                         :array[..,..] of longint;
  12.     key                         :array[..,..] of longint;
  13.     sum                         :array[..] of longint;
  14.     flag                        :array[..] of boolean;
  15.     que                         :array[..] of longint;
  16.     other, len, pre, succ       :array[..] of longint;
  17.     l                           :longint;
  18.     last                        :array[..] of longint;
  19.     source, sink                :longint;
  20.     ans                         :longint;
  21.     d                           :array[..] of longint;
  22.      
  23. function min(a,b:longint):longint;
  24. begin
  25.     if a>b then min:=b else min:=a;
  26. end;
  27.      
  28. procedure connect(x,y,z:longint);
  29. begin
  30.     inc(l);
  31.     pre[l]:=last[x];
  32.     succ[pre[l]]:=l;
  33.     last[x]:=l;
  34.     other[l]:=y;
  35.     len[l]:=z;
  36. end;
  37.      
  38.      
  39. procedure topo_sort;
  40. var
  41.     h, t, q, p                  :longint;
  42.     i                           :longint;
  43.     cur                         :longint;
  44.      
  45. begin
  46.     h:=; t:=;
  47.     for i:= to num[n-,m-] do
  48.         if sum[i]= then
  49.         begin
  50.             inc(t);
  51.             que[t]:=i;
  52.         end;
  53.     while h<t do
  54.     begin
  55.         inc(h);
  56.         cur:=que[h];
  57.         q:=last[cur];
  58.         flag[cur]:=true;
  59.         while q<> do
  60.         begin
  61.             p:=other[q];
  62.             if len[q]= then
  63.             begin
  64.                 dec(sum[p]);
  65.                 if sum[p]= then
  66.                 begin
  67.                     inc(t);
  68.                     que[t]:=p;
  69.                 end;
  70.             end;
  71.             q:=pre[q];
  72.         end;
  73.     end;
  74. end;
  75.      
  76. procedure init;
  77. var
  78.     i, j, k                     :longint;
  79.     x, y, cur                   :longint;
  80.     q, p                        :longint;
  81.      
  82. begin
  83.     read(n,m);l:=;
  84.     for i:= to n- do
  85.         for j:= to m- do
  86.             num[i,j]:=i*m+j+;
  87.     for i:= to n- do
  88.         for j:= to m- do
  89.         begin
  90.             read(key[i,j]);
  91.             read(cur);
  92.             for k:= to cur do
  93.             begin
  94.                 read(x,y);
  95.                 connect(num[i,j],num[x,y],);
  96.                 inc(sum[num[x,y]]);
  97.                 connect(num[x,y],num[i,j],maxlongint);
  98.             end;
  99.         end;
  100.     for i:= to n- do
  101.         for j:= to m- do
  102.         begin
  103.             connect(num[i,j],num[i,j-],);
  104.             inc(sum[num[i,j-]]);
  105.             connect(num[i,j-],num[i,j],maxlongint);
  106.         end;
  107.     topo_sort;
  108.     for i:= to num[n-,m-] do
  109.         if not flag[i] then
  110.         begin
  111.             q:=last[i];
  112.             while q<> do
  113.             begin
  114.                 p:=q xor ;
  115.                 if succ[p]<> then pre[succ[p]]:=pre[p];
  116.                 succ[pre[p]]:=succ[p];
  117.                 q:=pre[q];
  118.             end;
  119.         end;
  120. end;
  121.  
  122. function bfs:boolean;
  123. var
  124.     q, p                        :longint;
  125.     h, t                        :longint;
  126.     cur                         :longint;
  127.      
  128. begin
  129.     fillchar(d,sizeof(d),);
  130.     h:=; t:=;
  131.     d[source]:=;
  132.     que[]:=source;
  133.     while h<t do
  134.     begin
  135.         inc(h);
  136.         cur:=que[h];
  137.         q:=last[cur];
  138.         while q<> do
  139.         begin
  140.             p:=other[q];
  141.             if (flag[p]) and (len[q]>) and (d[p]=) then
  142.             begin
  143.                 inc(t);
  144.                 que[t]:=p;
  145.                 d[p]:=d[cur]+;
  146.                 if p=sink then exit(true);
  147.             end;
  148.             q:=pre[q];
  149.         end;
  150.     end;
  151.     exit(false);
  152. end;
  153.  
  154. function dinic(x,flow:longint):longint;
  155. var
  156.     q, p                        :longint;
  157.     tmp, rest                   :longint;
  158. begin
  159.     if x=sink then exit(flow);
  160.     rest:=flow;
  161.     q:=last[x];
  162.     while q<> do
  163.     begin
  164.         p:=other[q];
  165.         if (len[q]>) and (flag[p]) and (d[x]+=d[p]) and (rest>) then
  166.         begin
  167.             tmp:=dinic(p,min(rest,len[q]));
  168.             dec(rest,tmp); 
  169.             dec(len[q],tmp);
  170.             inc(len[q xor ],tmp);
  171.         end;
  172.         q:=pre[q];
  173.     end;
  174.     exit(flow-rest);
  175. end;
  176.  
  177. procedure main;
  178. var
  179.     i, j                        :longint;
  180. begin
  181.     source:=num[n-,m-]+; sink:=source+;
  182.     for i:= to n- do
  183.         for j:= to m- do
  184.         if flag[num[i,j]] then
  185.             if key[i,j]> then
  186.             begin
  187.                 inc(ans,key[i,j]);
  188.                 connect(source,num[i,j],key[i,j]);
  189.                 connect(num[i,j],source,);
  190.             end else
  191.             begin
  192.                 connect(num[i,j],sink,-key[i,j]);
  193.                 connect(sink,num[i,j],);
  194.             end;
  195.     flag[sink]:=true; flag[source]:=true;
  196.     while bfs do ans:=ans-dinic(source,maxlongint);
  197.     if ans> then writeln(ans) else writeln();
  198. end;
  199.  
  200. begin
  201.     init;
  202.     main;
  203. end.
 

bzoj 1565 最大权闭合子图的更多相关文章

  1. bzoj 1497(最大权闭合子图)

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6410  Solved: 3099[Submit][Status] ...

  2. BZOJ 1565 NOI2009 植物大战僵尸 topo+最小割(最大权闭合子图)

    题目链接:https://www.luogu.org/problemnew/show/P2805(bzoj那个实在是有点小小的辣眼睛...我就把洛谷的丢出来吧...) 题意概述:给出一张有向图,这张有 ...

  3. BZOJ 1565 / P2805 [NOI2009]植物大战僵尸 (最大权闭合子图 最小割)

    题意 自己看吧 BZOJ传送门 分析 - 这道题其实就是一些点,存在一些二元限制条件,即如果要选uuu则必须选vvv.求得到的权值最大是多少. 建一个图,如果选uuu必须选vvv,则uuu向vvv连边 ...

  4. BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)

    图中的保护关系就类似于最大权闭合子图.即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边.那么题目就转化成了最大权闭合子图的问题. 但是这个图有点特殊啊... 考虑有环的情况,显然这个环以 ...

  5. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】

    一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...

  6. BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流

    题意: 植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: (1)价值: (2)保护集合,也就是这个植物可以保护矩阵中的某些格子. 现在你是僵尸,你每次只能从(i,m) 格子 ...

  7. BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)

    BZOJ 最大密度子图. 二分答案\(x\),转为求是否存在方案满足:\(边数-x*点数\geq 0\). 选一条边就必须选两个点,所以可以转成最大权闭合子图.边有\(1\)的正权,点有\(x\)的负 ...

  8. BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

    链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...

  9. [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...

随机推荐

  1. 常规轮询请求,客户端用Ajax调webservice的方法

    服务端发布webservice,下图方框中的一定要有 客户端代码 <script type="text/javascript"> $(document).ready(f ...

  2. webview 中 svg的坑

    在这里不会详细介绍如何绘制svg图片,是讲一个很小的bug,看图 在这张图中,上面带有纹理和弧度的图片,原本是直接切了一张png的图片,但是由于是在app的登录注册的首页,那么这个35k的图片就会非常 ...

  3. 学习c语言的第9天

    #include <stdio.h> int main() { float sum=0,wage=0; int i=1; int num; printf("+++平均工资统计程序 ...

  4. 最新hosts,更新hosts,可用

    点击这里,全选后复制,粘贴到C:\Windows\System32\drivers\etc的hosts里面,把原来的置换了

  5. 【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)

    关键字: MemoryStream.WMP.WindowsMediaPlayer.Play .Load. Delphi.C++.C#.ActiveX控件 作  者: CaiBirdy 问  题:正常使 ...

  6. 西门子MES解决方案SIMATIC IT在乳制品行业小试牛刀

    竞争的白热化,紧缩的产品利润,食品安全保障,越来越苛刻的法规要求和全球化的市场与品牌维持的重要性对乳品行业的企业提出了更高的要求,实施 MES将是企业唯一的出路. 自从“十一五”制造业信息化为MES正 ...

  7. Learning Scrapy笔记(七)- Scrapy根据Excel文件运行多个爬虫

    摘要:根据Excel文件配置运行多个爬虫 很多时候,我们都需要为每一个单独的网站编写一个爬虫,但有一些情况是你要爬取的几个网站的唯一不同之处在于Xpath表达式不同,此时要分别为每一个网站编写一个爬虫 ...

  8. virtualenv 安装

    virtualenv 是一个创建隔离的Python环境的工具. virtualenv要解决的根本问题是库的版本和依赖,以及权限问题.假设你有一个程序,需要LibFoo的版本1,而另一个程序需要版本2, ...

  9. 学习XML总结

    XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分. 元素可包含其他元素.文本或者两者的混合物.元素也可以拥有属性. xml包含如下: 元素 文本 属性 元素 命名: 名称可以含字母. ...

  10. hdu 2425 Hiking Trip

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2425 Hiking Trip Description Hiking in the mountains ...