【bzoj1066】: [SCOI2007]蜥蜴

把石柱拆点,流量为高度

然后S与蜥蜴连流量1的边

互相能跳到的石柱连inf的边

石柱能到边界外的和T连inf的边

然后跑dinic就好了

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
const int N=;
const int inf=1e9;
struct edge{
int next,to,c;
}e[N+];
int ade=,S=,T=,n,m,c,d,CNT=;
int first[N+],dis[N+],now[N+],mp[][],I[][],O[][];
queue <int> Q; void addedge(int x,int y,int cap){
e[++ade].next=first[x];
e[ade].to=y;
e[ade].c=cap;
first[x]=ade;
e[++ade].next=first[y];
e[ade].to=x;
e[ade].c=;
first[y]=ade;
} #define s e[x].to
#define cap e[x].c
#define CAP e[x^1].c
bool bfs(){
for (int i=;i<=CNT;i++) dis[i]=inf;
Q.push(S);
dis[S]=;
while (!Q.empty()){
int p=Q.front();
Q.pop();
for (int x=first[p];x;x=e[x].next){
if (dis[s]>dis[p]+ && cap>){
Q.push(s);
dis[s]=dis[p]+;
}
}
}
return dis[T]!=inf;
} int dfs(int p,int mf){
if (p==T) return mf;
for (int x=now[p];x;x=e[x].next){
now[p]=x;
if (dis[s]==dis[p]+ && cap>){
int f=dfs(s,min(mf,cap));
if (f){
cap-=f;
CAP+=f;
return f;
}
}
}
return ;
}
#undef s
#undef cap
#undef CAP int dinic(){
int ans=,f;
while (bfs()){
for (int i=;i<=CNT;i++) now[i]=first[i];
while (f=dfs(S,inf)){
ans+=f;
}
}
return ans;
} void make_p(){
for (int i=;i<=n;i++){
for (int j=;j<=m;j++){
if (mp[i][j]){
addedge(I[i][j],O[i][j],mp[i][j]);
for (int x=i-d;x<=i+d;x++){
for (int y=j-d;y<=j+d;y++){
if (abs(i-x)+abs(j-y)>d) continue;
if (x< || x>n || y< || y>m) {addedge(O[i][j],T,inf); continue;}
if (mp[x][y] && (x!=i || y!=j)){addedge (O[i][j],I[x][y],inf); }
}
}
}
}
}
} int main(){
scanf("%d%d%d",&n,&m,&d);
for (int i=;i<=n;i++){
char s[];
scanf("%s",s+);
for (int j=;j<=m;j++){
mp[i][j]=s[j]-'';
if (mp[i][j]) I[i][j]=++CNT,O[i][j]=++CNT;
}
}
make_p();
for (int i=;i<=n;i++){
char s[];
scanf("%s",s+);
for (int j=;j<=m;j++){
if (s[j]=='L'){
addedge(S,I[i][j],);
c++;
}
}
}
printf("%d\n",c-dinic());
return ;
}

【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流的更多相关文章

  1. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

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

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

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

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

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

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

  5. P2472 [SCOI2007]蜥蜴(最大流)

    P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...

  6. bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...

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

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

  8. BZOJ1066 [SCOI2007]蜥蜴

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

  9. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

随机推荐

  1. leetcode144

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  2. RAD 10 蓝牙

    http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Bluetooth.TBluetoothLEManager.StartDiscov ...

  3. 解决free -h cached 过大 问题

    //先同步数据 sync //cache 释放: //To free pagecache: echo 1 > /proc/sys/vm/drop_caches //To free dentrie ...

  4. imp导入数据的时候报错:ORA-01658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区

    在oracle里创建表,报出错: ORA-01658: 无法为表空间space中的段创建 INITIAL 区: 或者: ORA-01658: unable to create INITIAL exte ...

  5. 【HDU1573】X问题

    [题目描述] 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = ...

  6. oralce错误总结

    1>System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本. 给oracle客户端的bin目录添加““Authenticated Users”权 ...

  7. c语言解二元二次方程组

    设a和b是正整数 a+b=30 且a*b=221 求a和b的值 思路就是穷举a和b的值,每次得到a和b的一个值,看是否同时满足a+b=30且a*b=221,如果满足,那么就输出. 那么a和b的的取值范 ...

  8. c语言实践 1/1-1/2+1/3-1/4+...

    其实这个题目和上面那个是一样的 /* 1/1-1/2+1/3-1/4+...1/n; */ int n = 1; double sum = 0; double frac = 0; int i = 1; ...

  9. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

  10. mysql for visual

    http://dev.mysql.com/downloads/file.php?id=458484