将每个石柱拆成两个点,分别是进入的和出去的,两个点之间连石柱的高度

然后每个出去的点连别的石柱的进去的点,

源点连所有蜥蜴所在柱子,每个能跳出去的连汇点,然后最大流就行了

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
var
    r, c, d                             :longint;
    map, jump                           :array[..,..] of char;
    pre, other, len                     :array[..] of longint;
    last                                :array[..] of longint;
    num                                 :array[..,..] of longint;
    source, sink                        :longint;
    l                                   :longint;
    que, dis                            :array[..] of longint;
    ans, sum                            :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];
    last[x]:=l;
    other[l]:=y;
    len[l]:=z;
end;
     
procedure init;
var
    i, j, ii, jj                        :longint;
    k                                   :longint;
     
begin
    readln(r,c,d); l:=;
    for i:= to r do
    begin
        for j:= to c do
            read(map[i,j]);
        readln;
    end;
     
    for i:= to r do
    begin
        for j:= to c do read(jump[i,j]);
        readln;
    end;
     
    for i:= to r do
        for j:= to c do num[i,j]:=c*(i-)+j;
    source:=*r*c+; sink:=source+;
     
    for i:= to r do
        for j:= to c do
            if jump[i,j]='L' then
            begin
                connect(source,num[i,j],);
                connect(num[i,j],source,);
                inc(sum);
            end;
     
    for i:= to r do
        for j:= to c do
            if map[i,j]<>'' then
            begin
                for ii:= to r do
                    for jj:= to c do
                        //if (i<>ii) or (j<>jj) then
                        begin
                            if (sqrt((i-ii)*(i-ii)+(j-jj)*(j-jj))<=d) then
                            begin
                                connect(num[i,j]+r*c,num[ii,jj],maxlongint div );
                                connect(num[ii,jj],num[i,j]+r*c,);
                            end;
                        end;   
            end;
 
    for i:= to d do
        for j:= to c do
            if map[i,j]<>'' then
            begin
                connect(num[i,j]+r*c,sink,maxlongint div );
                connect(sink,num[i,j]+r*c,);
            end;
    for i:=r-d+ to r do
        for j:= to c do
            if map[i,j]<>'' then
            begin
                connect(num[i,j]+r*c,sink,maxlongint div );
                connect(sink,num[i,j]+r*c,);
            end;
    for i:= to r do
        for j:= to d do
            if map[i,j]<>'' then
            begin
                connect(num[i,j]+r*c,sink,maxlongint div );
                connect(sink,num[i,j]+r*c,);
            end;
             
    for i:= to r do
        for j:=c-d+ to c do
            if map[i,j]<>'' then
            begin
                connect(num[i,j]+r*c,sink,maxlongint div );
                connect(sink,num[i,j]+r*c,);
            end;
    for i:= to r do   
        for j:= to c do
            if map[i,j]<>'' then
            begin
                k:=ord(map[i,j])-;
                connect(num[i,j],num[i,j]+r*c,k);
                connect(num[i,j]+r*c,num[i,j],);
            end;
end;
 
function bfs:boolean;
var
    h, t, cur                           :longint;
    q, p                                :longint;
begin
    fillchar(dis,sizeof(dis),);
    h:=; t:=;
    que[]:=source; dis[source]:=;
    while h<t do
    begin
        inc(h);
        cur:=que[h];
        q:=last[cur];
        while q<> do
        begin
            p:=other[q];
            if (len[q]>) and (dis[p]=) then
            begin
                inc(t);
                que[t]:=p;
                dis[p]:=dis[cur]+;
                if p=sink then exit(true);
            end;
            q:=pre[q];
        end;
    end;
    exit(false);
end;
 
function dinic(x,flow:longint):longint;
var
    tmp, rest                           :longint;
    q, p                                :longint;
begin
    if x=sink then exit(flow);
    rest:=flow;
    q:=last[x];
    while q<> do
    begin
        p:=other[q];
        if (dis[x]=dis[p]-) and (len[q]>) 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;
begin
    while bfs do
        ans:=ans+dinic(source,maxlongint div );
    writeln(sum-ans);
end;
     
begin
    init;
    main;
end.

bzoj 1066 最大流的更多相关文章

  1. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

  2. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  3. poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流

    题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...

  4. BZOJ 1066 蜥蜴 最大流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1066 题目大意: 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥 ...

  5. BZOJ 1066 [SCOI2007]蜥蜴(最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...

  6. BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )

    结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...

  7. BZOJ 1066:[SCOI2007]蜥蜴(最大流)

    蜥蜴Description在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...

  8. AC日记——[SCOI2007]蜥蜴 bzoj 1066

    1066 思路: 网络流最大流: 拆点,每个点拆成两个,流量为这个点的高度: 注意,文中说的距离是曼哈顿距离(劳资以为开根号wa了不知道多少次): 每两个距离不大于d的点连边,流量inf: 如果距离能 ...

  9. bzoj 1066 蜥蜴

    最大流. 建图:首先将每根柱子拆成两个点. 每根柱子的入点向出点连一条容量为柱子高度的边. 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边. 源点向每根初始有蜥蜴的柱子的入点连一条容量为一 ...

随机推荐

  1. c++ constructor, copy constructor, operator =

    // list::push_back #include <iostream> #include <list> class element{ private: int numbe ...

  2. VS2013生产过程问题及解决

    TRK0002错误 现象:编译器.链接器交替报错,不能正常生成 环境:Win8.1 + VS2013 + 百度杀毒 解决:退出百度杀毒,重启VS,再进行生成 修订:发现问题依旧,经过多次试验,发现与杀 ...

  3. mysql 查询当月天数

    SELECT day(LAST_DAY('2018-02-01')) 思路: 先通过LAST_DAY() 查找当月最后一天,然后通过day()返回天数.

  4. C++知识点 内存占用问题

    有一次去面试,谈的挺好的,被人问了一个问题,瞬间暴露自己基础能力弱的弱点了,这里自己记录下,以后慢慢长进. 问题 char test1[]={1,2,3,4}; char test2[]={1,2,3 ...

  5. 虚拟现实-VR-UE4-创建C++版工程

    首先,创建C++版本的UE4 项目工程,我使用的是4.12.3版本,据了解,新版本后面的编译都是vs2015 所以,想要创建C++版本的工程,就需要安装vs2015 至于vs2015的安装,自己百度吧 ...

  6. cut 与 awk

    cut和awk都能分割显示需要的内容 但在需要以空格为分隔符的情况下: # free -m|grep Mem Mem: cut是以单一空格为分隔符的: # free -m|grep Mem|cut - ...

  7. LeetCode 36——有效的数独

    1. 题目 2. 解答 将数独中数字的 ASCII 码值转化到 0-8 之间作为散列值,建立一个散列表,然后分别逐行.逐列.逐宫(3*3小块)统计每个数字的出现次数,若出现次数大于 1,则数独无效. ...

  8. 图解Transformer

    图解Transformer 前言 Attention这种机制最开始应用于机器翻译的任务中,并且取得了巨大的成就,因而在最近的深度学习模型中受到了大量的关注.在在这个基础上,我们提出一种完全基于Atte ...

  9. 【集训试题】SiriusRen的卡牌 set

    题意概述: 给出N张卡牌,每张有三个属性a,b,c,同时给出所有属性可能的最大值A,B,C.对于一张卡牌,当这张卡牌至少有两个属性大于另外一张卡牌的对应两个属性的时候,认为这张卡牌更加优秀.现在问有多 ...

  10. 项目启动报错: No naming context bound to this class loader

    发步项目到本地tomcat,启动后,一直包错:  警告: Failed to retrieve JNDI naming context for container [StandardEngine[Ca ...