拆点,将一个柱子拆成入点和出点,入点出点之间的容量就是柱子的容量

     1066: [SCOI2007]蜥蜴

在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。

Input

  输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

Output

  输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

Sample Input

5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

Sample Output

1

 #include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int r,c,d,st,ed,tot;
int dis[],head[];
char mp[];
struct node
{
    int x,y,ab;
    bool ri;
} p[];
struct line
{
    int to,next,w;
} e[];
void add(int u,int v,int w)
{
    e[tot].to=v;
    e[tot].next=head[u];
    e[tot].w=w;
    head[u]=tot++;
}
bool bfs()
{
    queue<int>Q;
    Q.push(st);
    memset(dis,-,sizeof(dis));
    dis[st]=;
    while(!Q.empty())
    {
        int u=Q.front();
        Q.pop();
        for(int i=head[u]; i+; i=e[i].next)
        {
            int v=e[i].to;
            if(dis[v]==-&&e[i].w>)
            {
                dis[v]=dis[u]+;
                if(v==ed) return true;
                Q.push(v);
            }
        }
    }
    return false;;
}
int dfs(int u,int low)
{
    if(u==ed) return low;
    int ans=low,a;
    for(int i=head[u]; i+; i=e[i].next)
    {
        int v=e[i].to;
        if(e[i].w>&&dis[v]==dis[u]+&&(a=dfs(v,min(ans,e[i].w))))
        {
            e[i].w-=a;
            e[i^].w+=a;
            ans-=a;
            if(!ans) return low;
        }
    }
    if(ans==low) dis[u]=-;
    return low-ans;
}
bool Ju(const node &A,const node &B)
{
    int dis=(A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
    if(dis>d) return false;
    return true;
}
int dinic()
{
    int ans=;
    while(bfs())
    {
        ans+=dfs(,INF);
    }
    return ans;
}
int main()
{
    scanf("%d%d%d",&r,&c,&d);
    int cont=,ct=;
    tot=;
    for(int i=; i<r; ++i)
    {
        scanf("%s",mp);
        for(int j=; j<c; ++j)
        {
            p[++cont].x=i;
            p[cont].y=j;
            p[cont].ab=mp[j]-'';
        }
    }
    st=,ed=*cont+;
    memset(head,-,sizeof(head));
    cont=;
    for(int i=; i<r; ++i)
    {
        scanf("%s",mp);
        for(int j=; j<c; ++j)
            if(mp[j]=='L') p[++cont].ri=,++ct;
            else p[++cont].ri=;
    }
    for(int i=; i<=cont; ++i)
    {
        if(p[i].ab)
        {
            add(i,i+cont,p[i].ab), add(i+cont,i,);
            if(p[i].ri) add(,i,),add(i,,);
            for(int j=; j<=cont; ++j)
            {
                if(i==j) continue;
                if(p[j].ab&&Ju(p[i],p[j]))
                {
                    add(i+cont,j,INF);
                    add(j,i+cont,);
                }
            }
            if(p[i].x-d<||p[i].x+d>=r||p[i].y-d<||p[i].y+d>=c)
            {
                    add(i+cont,ed,INF);
                    add(ed,i+cont,);
            }
        }
    }
    int ans=dinic();
    printf("%d\n",ct-ans);
}

BZOJ1066 网络流的更多相关文章

  1. BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】

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

  2. [bzoj1066] [SCOI2007] 蜥蜴 - 网络流

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

  3. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP

    由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html

  4. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  5. bzoj网络流

    近期看了一些bzoj的网络流,深感智商不够.不过对于网络流又有了进一步的理解. 还是mark一下吧. 献上几篇论文:1)<最小割模型在信息学竞赛中的应用> 2)<浅析一类最小割问题& ...

  6. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  7. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  8. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  9. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

随机推荐

  1. while循环脚本

    [root@oldboy ~]# (while :;do date;sleep 5;done)& fg ctrl c退出 fg ( while :; do date; sleep 5; don ...

  2. 配置secondarynamenode主机名masters

    1.配置hadoop的secondarynamenode,配置内容如下 node2 本文转自 素颜猪 51CTO博客,原文链接:http://blog.51cto.com/suyanzhu/19592 ...

  3. TX2开启最大功耗模式

    我们移植深度学习模型到Jetson TX2,为了获得更好的指标参数,我们需要将TX2开启最大功耗模式. Jetson TX2 工作模式及相应的CPU和GPU频率: 上电时,默认采用最低功耗模式1,风扇 ...

  4. 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射

    实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  5. 深度优先搜索理论基础与实践(java)

    概论 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为 DFS 即 Depth First Search.深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓 ...

  6. docker学习笔记一篇就通系列(持续更新)

    docker三要素 仓库 镜像 容器 仓库 仓库用来存放docker的镜像,类似于github存放代码医养 镜像 镜像是一个模板,封装了应用程序和配置依赖的可交付的运行环境,这个打包好的运行环境就是镜 ...

  7. libevent(二)尾队列 && 最小堆

    本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \ st ...

  8. vue项目兼容ie

    一.兼容ES6 Vue 的核心框架 vuejs 本身,以及官方核心插件(VueRouter.Vuex等)均可以在 ie9 上正常使用.但ie不兼容es6,所以需要安装插件将“Promise”等高级语法 ...

  9. 自己动手在Linux系统实现一个everything程序

    大家好,我是良许. 我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示: Linux 下也有一些类似于 ...

  10. [csu/coj 1083]贪心

    题意:给定n个线段,问能不能把x,y,z个长度为1,2,3的线段不重合地放进去. 思路:首先如果n个线段长度比要放的长度之和小,则无解,否则先考虑放2和3,如果2和3放下了1肯定可以放下(这是显然的) ...