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

     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. Libra教程之:Libra testnet使用指南

    文章目录 Libra testnet网络 下载和安装Libra 编译Libra client并连接到Testnet网络 创建两个A和B的两个账号 检查libra cli Client是否运行 创建A的 ...

  2. 【Linux常见命令】cat命令

    cat - concatenate files and print on the standard output cat 命令用于连接文件并打印到标准输出设备上. 用法: 1. cat file 查看 ...

  3. python 多进程处理 multiprocessing模块

    前提: 有时候一个用一个进程处理一个列表中的每个元素(每个元素要传递到一个函数中进行处理),这个时候就要用多进程处理 1 现场案例: 我有一个[ip1,ip2,ip3,.......]这样的列表,我要 ...

  4. linux系统单网卡绑定多个IP地址

    说明: 单网卡绑定两个IP地址,电信和联通,目的:是为了当电信出故障联通正常使用. 系 统 IP地址 子网掩码 网关 CentOS 6.3_64bit eth0:116.18.176.19 255.2 ...

  5. 最小生成树之prime算法

    public class Prime { public static void main(String[] args) { //路径矩阵 int arcs[][] = {{-1,6,1,5,-1,-1 ...

  6. Xapian实战(二):core concepts

    参考资料 core concepts 正文 1. 并发性 xapian不包含任何全局变量,所以多线程编程中,在没有共享资源的情况下可以安全使用xapian.在实际操作中,由于每个线程都可以创建自己的x ...

  7. 数学--数论--HDU1222 狼和兔子(最大公约数)

    问题描述 有一座周围有n个洞的小山.孔从0到n-1有符号. 兔子必须藏在其中一个洞中.狼以逆时针方向搜索兔子.他第一个进入的洞是一个用0签名的洞.然后,他将每m个洞进入一个洞.例如,m = 2和n = ...

  8. 白话typescript中的【extends】和【infer】(含vue3的UnwrapRef)

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. extends types ...

  9. 一只简单的网络爬虫(基于linux C/C++)————利用正则表达式解析页面

    我们向一个HTTP的服务器发送HTTP的请求后,服务器会返回可能一个HTML页面(当然也可以是其他的资源),我们可以利用返回的HTML页面,在其中寻找其他的Url,例如我们可以这样在浏览器上查看一下H ...

  10. 说一说Web开发中两种常用的分层架构及其对应的代码模型

    昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...