BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】
BZOJ1066 SCOI2007 蜥蜴
Description
在一个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
HINT
100%的数据满足:1<=r, c<=20, 1<=d<=4
一道比较裸的(套路)最大流板子 
把一个石柱点分成进和出两个部分,中间连一条容量为高度的边 
然后就可以做完了
//yangkai
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 10010
struct Edge{int u,v,cap,flow;};
struct Dinic{
    int s,t;
    int vis[N],d[N];
    vector<Edge> E;
    vector<int> G[N];
    void add(int u,int v,int cap){
        E.push_back((Edge){u,v,cap,0});
        E.push_back((Edge){v,u,0,0});
        int cnt=E.size();
        G[u].push_back(cnt-2);
        G[v].push_back(cnt-1);
    }
    bool BFS(){
        memset(vis,0,sizeof(vis));
        memset(d,0,sizeof(d));
        queue<int> Q;
        Q.push(s);
        vis[s]=1;
        while(!Q.empty()){
            int u=Q.front();Q.pop();
            for(int i=0;i<G[u].size();i++){
                Edge &e=E[G[u][i]];
                if(!vis[e.v]&&e.cap>e.flow){
                    vis[e.v]=1;
                    d[e.v]=d[u]+1;
                    Q.push(e.v);
                }
            }
        }
        return vis[t];
    }
    int DFS(int u,int a){
        if(u==t||!a)return a;
        int flow=0;
        for(int i=0;i<G[u].size();i++){
            Edge &e=E[G[u][i]];
            if(d[e.v]!=d[u]+1)continue;
            int f=DFS(e.v,min(a,e.cap-e.flow));
            e.flow+=f;
            E[G[u][i]^1].flow-=f;
            flow+=f;
            a-=f;
            if(!a)break;
        }
        return flow;
    }
    int Maxflow(){
        int flow=0;
        while(BFS())
            flow+=DFS(s,INF);
        return flow;
    }
}dinic;
int w,h,d,sum=0;
int g[30][30],p[30][30];
char op[30];
bool judge_in(int x1,int x2,int y1,int y2){
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=d*d;
}
int getid(int x,int y){
    return (x-1)*h+y;
}
void build(){
    dinic.s=0;dinic.t=w*h*2+1;
    for(int i=1;i<=w;i++)
        for(int j=1;j<=h;j++)
            if(p[i][j])dinic.add(dinic.s,getid(i,j)*2-1,1);
    for(int i=1;i<=w;i++)
        for(int j=1;j<=h;j++)
            if(i<=d||i>=(w-d+1)||j<=d||j>=(h-d+1))
                dinic.add(getid(i,j)*2,dinic.t,INF);
    for(int i=1;i<=w;i++)
        for(int j=1;j<=h;j++)
            for(int ii=1;ii<=w;ii++)
                for(int jj=1;jj<=h;jj++)
                    if(judge_in(i,ii,j,jj))
                        dinic.add(getid(i,j)*2,getid(ii,jj)*2-1,INF);
    for(int i=1;i<=w;i++)
        for(int j=1;j<=h;j++)
            if(g[i][j])dinic.add(getid(i,j)*2-1,getid(i,j)*2,g[i][j]);
}
int main(){
    cin>>w>>h>>d;
    for(int i=1;i<=w;i++){
        scanf("%s",op+1);
        for(int j=1;j<=h;j++)g[i][j]=op[j]-'0';
    }
    for(int i=1;i<=w;i++){
        scanf("%s",op+1);
        for(int j=1;j<=h;j++){
            p[i][j]=(op[j]=='L')?1:0;
            sum+=p[i][j];
        }
    }
    build();
    cout<<sum-dinic.Maxflow();
    return 0;
}												
											BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】的更多相关文章
- BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
		
由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html
 - bzoj1066: [SCOI2007]蜥蜴(最大流)
		
1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...
 - [bzoj1066] [SCOI2007] 蜥蜴 - 网络流
		
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个 ...
 - 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
		
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
 - 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
		
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
 - P2472 [SCOI2007]蜥蜴(最大流)
		
P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...
 - bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...
 - 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...
 - BZOJ1066 [SCOI2007]蜥蜴
		
首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...
 
随机推荐
- go入门环境配置
			
1.安装golang(64位).MinGW(64位).LiteIDE(32位) 下载golang安装包,双击安装,默认安装目录:C:\Go: MinGW安装包(x86_64-4.8.2-release ...
 - JavaScript权威指南--客户端存储
			
客户端存储web应用允许使用浏览器提供的API实现将数据存储在用户电脑上. 客户端存储遵循“同源策略”,因此不同站点的页面是无法读取对于存储的数据.而同一站点的不同的页面之间是可以互相共享存储数据的. ...
 - python中装饰器的执行细节
			
本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...
 - python ssh登录
			
3. 编写linkssh.py #!/usr/bin/env python# -*- coding: utf-8 -*-# filename: pexpect_test.py'''Created on ...
 - CSS布局框架 960GS 表单排版示例
 - 以普通用户启动的Vim如何保存需要root权限的文件
			
在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误: E45: 'readonly' option is set (add ! to ...
 - Attribute 'items' must be an array, a Collection or a Map错误解决!
			
唉!真的要说一句话叫做论一串代码的重要性!就是如此的气人!气的牙根痒痒! 前几天刚刚写过SpringMVC之ModelAndView的 jsp值在浏览页面不显示的问题!也是因为这一串代码,但是这一次一 ...
 - python2 commands模块在python3.x被subprocess取代
			
subprocess 可以执行shell命令的相关模块和函数有: os.systemos.spawnos.popen --废弃popen2.* --废弃commands.* --废弃,3.x中被移除 ...
 - Shell 变量,Shell echo命令
			
一.Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟 ...
 - 使用XMLHttpRequest对象完成原生的AJAX请求
			
1.大家眼中的Ajax 说到Ajax,只要有过前端开发经验的童鞋一定都不陌生,大都知道它就是一种与后端之间的通信技术,通过这个神奇的家伙,我们不用像传统表单那样填完信息一点提交就呼啦呼啦跳转了.Aja ...