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 ...