题目传送门

经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了。

由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量。

建图:

  1.建超级源和超级汇,设超级源连到每只蜥蜴的边容量为1,每个可以跳到外面的点连到超级汇的边的容量为maxlongint。

  2.对于每个点建一个虚点,连边到此虚点,边容量为该点石柱高度。对于每个可以互相跳到的点,建立容量为maxlongint的边。这样当前点到其他点的总容量为该点的石柱高度。(拆点)

然后跑一遍Dinic就好了。

注意用蜥蜴的总数减去最大流才是答案。

code:

/**************************************************************
Problem: 1066
User: yekehe
Language: C++
Result: Accepted
Time:40 ms
Memory:6380 kb
****************************************************************/ #include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; int r,c,d,a[][],L;
string S; int head[],nxt[],W[],To[],cnt;
void add(int x,int y,int c)
{
W[cnt]=c;
To[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
cnt++;
} int check(int x,int y,int fx,int fy)
{
return (x-fx)*(x-fx)+(y-fy)*(y-fy)<=d*d;
} int l[],dist[];
int BFS()
{
int tl=,hd=;
hd=tl=;
l[++tl]=;
memset(dist,-,sizeof dist);
dist[]=;
while(hd<tl){
int front=l[++hd];
for(int i=head[front];i!=-;i=nxt[i]){
if(dist[To[i]]==- && W[i]){
dist[To[i]]=dist[front]+;
l[++tl]=To[i];
}
}
}
return dist[r*c*+]!=-;
} int DFS(int now,int x)
{
if(now==r*c*+ || !x)return x;
int res=;
for(int i=head[now];i!=- && x;i=nxt[i]){
if(dist[now]+==dist[To[i]]&&W[i]){
int DK=DFS(To[i],min(x,W[i]));
W[i]-=DK;W[i^]+=DK;
x-=DK;res+=DK;
}
}
if(!res)dist[now]=-;
return res;
} void Dinic()
{
int ans=;
while(BFS())
ans+=DFS(,2e9);
printf("%d",L-ans);
return ;
} int main()
{
// freopen("x.txt","r",stdin);
scanf("%d%d%d",&r,&c,&d);
memset(nxt,-,sizeof nxt);
memset(head,-,sizeof head);
register int i,j,k,h;
#define Size ( r*c )
#define fr ( (i-1)*c+j )
#define to ( (k-1)*c+h )
for(i=;i<=r;i++){
cin>>S;
for(j=;j<S.size();j++){
a[i][j+]=S[j]-'';
}
}
for(i=;i<=r;i++){
cin>>S;
for(j=;j<=S.size();j++){
if(S[j-]=='L'){
L++;//求蜥蜴总数
add(,fr,);
add(fr,,);
}
}
}
for(i=;i<=r;i++)
for(j=;j<=c;j++){
if(!a[i][j])continue;
add(fr,fr+Size,a[i][j]);
add(fr+Size,fr,);
for(k=;k<=r;k++)
for(h=;h<=c;h++){
if(i==k&&j==h)continue;
if(a[k][h]/*减少边的总量*/&&check(i,j,k,h)){
add(fr+Size,to,2e9);
add(to,fr+Size,);
}
}
}
for(i=;i<=r;i++)
for(j=;j<=c;j++){
if(i<=d || j<=d || r-i+<=d || c-j+<=d){
if(!a[i][j])continue;//减少边的总量
add(fr+Size,Size<<|,2e9);
add(Size<<|,fr+Size,);
}
}
Dinic();
return ;
}

BZOJ1066_蜥蜴_KEY的更多相关文章

  1. 1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  2. bzoj 1066 蜥蜴

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

  3. BZOJ 1066 【SCOI2007】 蜥蜴

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

  4. 蜥蜴(bzoj 1066)

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

  5. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

  6. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit:  ...

  7. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

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

  8. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  9. BZOJ1066 [SCOI2007]蜥蜴

    首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...

随机推荐

  1. 一些通过SAP ABAP代码审查得出的ABAP编程最佳实践

    1. 这两个IF ELSE分支里检测的条件其实逻辑上来说都是同一类,应该合并到一个IF分支里进行检查: It is an expensive operation to open a file in a ...

  2. OC Nsstring的使用

    // // main.m // NSString // // Created by mj on 13-4-5. // Copyright (c) 2013年 itcast. All rights re ...

  3. hdu-3074 Multiply game---线段树+单点更新

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3074 题目大意: 给一些数,进行点更新或者是区间计算乘积 解题思路: 裸的线段树,注意空间开大点 # ...

  4. 使用 JDK XML 和 java对象相互转换

    Unmarshaller 类能将 XML 数据转换为 Java 内容对象. Marshaller 类能够将 Java 对象转换回 XML 数据. package jaxb; /** * Created ...

  5. non-fragile:oc2.0特性

    Runtime Versions and Platforms There are different versions of the Objective-C runtime on different ...

  6. 【[NOI2016]区间】

    发现自己的离散化姿势一直有问题 今天终于掌握了正确的姿势 虽然这并不能阻挡我noip退役爆零的历史进程 还是先来看看离散化怎么写吧,我以前都是这么写的 for(std::set<int>: ...

  7. java中构造器的调用顺序

    在编程的过程中,我们经常会遇到多个类的继承问题,那么多个类的构造器是按照什么顺序调用的呢? 先看一段代码: public class Meal { public Meal() { System.out ...

  8. HDU 4864 Task(经典贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS (Java/Others)    M ...

  9. Mark一下在模仿团购App搭建页面时犯的低级错误

    1.关于Xib拖线错误 2.下面这个错误的根源其实是代码提示时直接敲下了回车,没看仔细,导致后来找了好久才发现该错误,郁闷啊!

  10. DML-修改

    一, 修改单表的记录 语法: update 表名 set 字段=值[where 筛选条件] 二,修改多表 update 表名 别名 inner/left/rigth join 表二 on 连接条件 s ...