因为每个植物都有保护的点(每排相邻的右面的算是保护左面的),所以连他和保护
的点一条边,然后每个点有自己的权值,要找到最大的权值且满足每个点在访问时他
的前驱一定被访问,那么反向建边,转化为后继必须访问,即求一个
最大权闭合子图,然后转化为网络流最小割模型求解。。
然后因为成环的点肯定不会被毁掉,所以直接删了,可以由拓扑排序得出,可以提高速度
然后我还是tle了。。。有个480A的码,明儿看看啥意思吧。。。
/**************************************************************
    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 最大权闭合子图的更多相关文章

  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. TortoiseGit和Git操作git@osc简要说明

    之前搞过一次git@osc的操作,重装系统后今天准备再次提交代码,悲剧了,我忘了之前怎么干得了,再次百度以后,终于搞定了,准备写下来,省得下次再忘了. 1.首先生成key,使用下面的工具,在Torto ...

  2. Java实现九九乘法表的输出

    九九乘法表一般为三角形,每个数分别和从1到自身的数相乘然后把结果列出来,即要用到两层循环,外层是从1到9for(i=1;i<=9;i++),内层是当前数和从1到自身相乘for(j=1;j< ...

  3. [转]给C++初学者的50个忠告

    1.把C++当成一门新的语言学习(和C没啥关系!真的.):   2.看<Thinking In C++>,不要看<C++变成死相>:   3.看<The C++ Prog ...

  4. .NET Framework4.0 下的多线程

    一.简介 在4.0之前,多线程只能用Thread或者ThreadPool,而4.0下提供了功能强大的Task处理方式,这样免去了程序员自己维护线程池,而且可以申请取消线程等...所以本文主要描述Tas ...

  5. Keil的使用方法 - 常用功能(一)

    Ⅰ.概述 学习一门软件的开发,开发工具的掌握可以说尤为重要.由于Keil集成开发工具支持多种MCU平台的开发,是市面上比较常见的,也是功能比较强大一款IDE.所以,对于大多数人说,选择Keil几乎是单 ...

  6. LinqToSql和ASP.NET Entity FrameWork 中使用事务

    ASP.NET Entity FrameWork中: int flag = -1; if (this.URPmanagementEntities1.Connection.State != System ...

  7. 几条sql语句

    1.行.列转换 --行转列 ),科目 ),分数 int) ) ) ) ) ) ) ) ) ) --方法1 select 姓名, end) as 语文, end) as 数学, end) as 物理 f ...

  8. 算法系列6《MAC》

    1. 简介 MAC是使用命令的所有元素(包括命令头)产生的.一条命令的完整性,包括命令数据域(如果存在的话)中的数据元,通过安全报文传送得以保证.按照如下的方式使用单重或三重DEA加密方式产生MAC: ...

  9. SSH使用缩写

    需要经常ssh到其它机器上,但如果每次都使用主机命名或ip地址,那挺难受的.这里有2个方法可以在ssh登陆时缩写(简写)主机名. 1. 在~/.ssh中添加config文件 [toughhou@hd1 ...

  10. [原创]Postgres-XC集群笔记-概念与环境搭建

    文所描述的Postgres-XC版本:v1.2.1项目主页地址:http://sourceforge.net/projects/postgres-xc/ pdf文件下载: Postgres-XC集群搭 ...