题目大意:

在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高 度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同 一个石柱上。

这个应该还算是比较难的网络流的题目了吧, 至少对我这个刚刚接触新手的人来说只这样的,AC的过程是痛苦而又备受煎熬的,最后一步步调试下来成功提交的那刹那,感觉全身满满的正能量,闲话少扯了,下面开始直接讲我的思路。

一开始是从学长将网络流的ppt里面看到这题的,只知道是个最大流却又不知道怎么建图,然后想了一下,每根石柱上面能够供蜥蜴(包括一开始在它上面的蜥蜴)不会超过石柱的高

度,也就是可以把它的高度作为一个限制,这样把每一根石柱(i,j)(一维化表示为f = i*m+j)拆分为两个点u,v ,其中u= 2*f, v = 2*f+1,(也就是2*f^1),然后建立一条从

u--->v的边,容量为石柱高度。

然后怎样表示各个石柱之间的到达关系呢?对于两根距离不超过d的石柱,也就是蜥蜴能够从一根跳到另一根的时候,例如石柱1,2,可以建立v1--->u2,的一条容量无限大的边,由于

可自由跳动,因此应该反向再建一条,即u2-->v1的边。   对于一开始上面就有蜥蜴的石柱,以及能够跳出边界的石柱,我是这样处理的:有蜥蜴的边,从起点s建立一条到该石柱

的拆分点u的边,容量为1,应该是单向的;然后对于能够跳出边界,即到达安全区域的石柱,建立一条从该石柱的拆分点v到汇点t的无穷容量的边。

然后利用ISPA算方法就可以了,初始可分配流量可以大胆的分配为inf,因为起点到每一个石柱(有蜥蜴)拆分点的容量限制为1,这样就可以表示该石柱上一开始有唯一的蜥蜴。

代码如下:

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <cmath>
#define esp 1e-6
#define inf 0x0f0f0f0f
#define INF 200000
#define N 30
using namespace std; struct EDGE
{
int i, c;
EDGE *next, *ani;
} *Edge[INF], E[INF];
int Dfn[INF], Now[INF], cnt, flag[INF];
int src, sink;
int n, m, d, tot, ndot;
char aMat[N][N], bMat[N][N]; int dblcmp(double x)
{
if(fabs(x) < esp)
return ;
return x > ? : -;
}//读图
void ReadMat(int r, int &len, char (*Mat)[N])
{
for(int i = ; i < r; i++)
scanf("%s", Mat[i]);
len = strlen(Mat[]);
}//返回石柱的高度
int f(int i, int j)
{
return aMat[i][j] - '';
}//计算两根石柱之间的距离
double cal(double x, double y)
{
return sqrt(x*x+y*y);
}
void add(int i, int j, int c, EDGE &e1, EDGE &e2)
{
e1.i = j, e1.c = c, e1.next = Edge[i], e1.ani = &e2, Edge[i] = &e1;
e2.i = i, e2.c = , e2.next = Edge[j], e2.ani = &e1, Edge[j] = &e2;
}
void build(void)
{
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
{
int u, v, c;
if((c = f(i, j)))//表示该位置为石柱
{//拆分点
u = *(i*m+j), v = u ^ ;
//拆分点之间建立边
add(u, v, c, E[cnt], E[cnt + ]);
cnt +=;
add(v, u, c, E[cnt], E[cnt + ]);
cnt += ;
if(bMat[i][j] == 'L')//石柱上面有蜥蜴
{
tot++;
add(src, u, , E[cnt], E[cnt + ]);//将源点和该有蜥蜴的石柱连接一条容量为1的边
cnt +=;
}//搜索周围能够到达的石柱
for(int ii = i - d; ii <= i + d; ii++)
for(int jj = j - d; jj <= j + d; jj++)
if(!(ii == i && jj == j))
{
double dist = cal(ii - i, jj -j);
if(dblcmp(d - dist) >= )
{//石柱能够到达边界
if((ii < || ii >= n || jj < || jj >= m ) )
{
if(!flag[v])
add(v, sink, inf, E[cnt], E[cnt + ]),
flag[v] = ,
cnt += ;
}//能够到达另一个石柱
else if(f(ii, jj))
{
u = *(ii*m+jj);//两根石柱之间建立一条无穷容量的边
add(v, u, inf, E[cnt], E[cnt + ]);
cnt += ;
}
}
}
}
}
}
void init(void)
{
memset(Edge, , sizeof(Edge));
memset(flag, , sizeof(flag));
cnt = tot = ;
} int ISAP(int s, int end, int flow)
{
if(s == end)
return flow;
int i, tab = ndot -, now = , vary;
for(EDGE *p = Edge[s]; p && flow - now; p = p->next)
if(p->c)
{
if(Dfn[s] == Dfn[i = p->i] + )
vary = ISAP(i, end, min(flow - now, p->c)),
p->c -= vary, p->ani->c += vary, now +=vary;
if(p->c)
tab = min(tab, Dfn[i]);
if(Dfn[src] == ndot)
return now;
}
if(now == )
{
if(--Now[Dfn[s]] == )
Dfn[src] = ndot;
Now[Dfn[s] = tab + ]++;
}
return now;
}
int max_flow(int s, int end)
{
memset(Dfn, , sizeof(Dfn));
memset(Now, , sizeof(Now));
Now[] = ndot;
int ret = ;
for(; Dfn[s] < ndot;)
{ ret += ISAP(s, end, inf);
}
return ret;
}
int main(void)
{
int T;
for(int t = scanf("%d", &T); t <= T; t++)
{
init();
scanf("%d%d", &n, &d);
ReadMat(n, m, aMat);
ReadMat(n, m, bMat);
src = *n*m, sink = *n*m+;
build();
ndot = sink + ;
int ans = max_flow(src, sink);
ans = tot - ans;
if(ans)
printf("Case #%d: %d lizard%sleft behind.\n", t,ans,(ans == )?" was ":"s were ");
else printf("Case #%d: no lizard was left behind.\n", t);
}
return ;
}

POJ - 2711 Leapin' Lizards的更多相关文章

  1. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  2. poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流

    题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...

  3. Leapin' Lizards

    Leapin' Lizards 题目大意: 在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴 ...

  4. Leapin' Lizards(经典建图,最大流)

    Leapin' Lizards http://acm.hdu.edu.cn/showproblem.php?pid=2732 Time Limit: 2000/1000 MS (Java/Others ...

  5. HDU2732:Leapin' Lizards(最大流)

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. hdu2732 Leapin' Lizards (网络流dinic)

    D - Leapin' Lizards Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  7. HDU2732 Leapin' Lizards —— 最大流、拆点

    题目链接:https://vjudge.net/problem/HDU-2732 Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    M ...

  8. 【解题报告】 Leapin' Lizards HDU 2732 网络流

    [解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...

  9. HDU2732 Leapin' Lizards

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

随机推荐

  1. 理解Spark的RDD

    RDD是个抽象类,定义了诸如map().reduce()等方法,但实际上继承RDD的派生类一般只要实现两个方法: def getPartitions: Array[Partition] def com ...

  2. EPP3怎么安装SVN(EclipsePHP Studio 3.0)

    如果你和我一样,喜欢用eclipse,你想用用他来开发PHP,那么EPP是一个不错的选择(个人觉得,中文版的有点不习惯) 我们一般都用svn来进行版本控制和代码共享,但是用epp3的时候会遇到这么一个 ...

  3. (二)JAVA使用POI操作excel

    1,创建一个时间格式的单元格 Demo4.java package com.wishwzp.poi; import java.io.FileOutputStream; import java.util ...

  4. WPF嵌入百度地图完整实现

    无论是做App还是web开发,很多都会用到地图功能,一般都会调用第三方的API实现地图功能!而正如国内的地图API提供方,基本上对Android.IOS和web开发提供了很完整的一套API,但是对于桌 ...

  5. C语言遍历一个文件夹下面的所有文件

    主要用到的函数/function. These should get you started: opendir() readdir() closedir() fopen() fread() fwrit ...

  6. bat里如何用相对路径

    在bat中直接使用绝对路径没有问题,但是文件传到其他地方时,绝对路径会发生改变,因此想通过使用相对路径来解决. 可以通过在bat获取当前bat所在的目录,然后cd 该目录来解决该问题 在bat前面增加 ...

  7. springmvc(六)——视图和视图解析器

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoIAAAGrCAIAAADb2WEhAAAgAElEQVR4nOzdaVhTd78vfF8/z772c9 ...

  8. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  9. 九度OJ 1547 出入栈 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1547 题目描述: 给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈. 要求在操作序列的 ...

  10. Poj 2159 / OpenJudge 2159 Ancient Cipher

    1.链接地址: http://poj.org/problem?id=2159 http://bailian.openjudge.cn/practice/2159 2.题目: Ancient Ciphe ...