废话:

这道题不难,稍微构造一下图就可以套最大流的模板了。但是我还是花了好久才解决。一方面是最近确实非常没状态(托词,其实就是最近特别颓废,整天玩游戏看小说,没法静下心来学习),另一方面是不够细心,输出格式错了大意没有发现死一只和死多只之间的区别,卡在那里动不了。

题意:

在一张n*m的地图中,有一群蜥蜴,这群蜥蜴每次可以跳跃曼哈顿距离d(曼哈顿距离——dis(a, b) = |ax-bx|+|ay-by|,之后所有的距离都是曼哈顿距离),这些蜥蜴只能在地图上的一些柱子上跳跃。柱子i最多可以支持ki次经过。如果柱子i距离地图的边界的距离小于d那么蜥蜴可以从柱子i逃出升天。要求计算最后会有多少蜥蜴葬身图中。

输入:

第一行输入一个整数t,表示共有t组数据。

第二行输入两个整数n,d,表示这组数据中地图有n行,蜥蜴一次最大跳跃距离d。

接下来n行输入地图mp1,地图中的数字表示柱子可以经过的次数,0表示不可以经过。

接下来n行输入地图mp2,其中’.’表示空,’L’表示存在一只蜥蜴。

输出:

首先输出组数”Case #x: “,其中x表示第x组。

如果所有的蜥蜴都可以逃出,那么输出”no lizard was left behind.”

如果只有1只死去,那么输出”1 lizard was left behind.”

如果死去多于1只,那么输出”y lizards were left behind.”y表示死去的蜥蜴数量。

题解:

经过一番变化,我们可以构造出一张有向图,然后使用最大流来解决这个问题。

构造方法如下——

  1. 我们设源点为0,汇点为2*n*m+1(其中n为地图的行,m为地图的列),设图中两点p1到p2的距离,即p1到p2的有向边为mp[p1][p2]。
  2. 将地图mp1中所有的点拆分成两个点,点pij拆分为mp[][]中的点i*m+j+1与n*m+i*m+j+1,添加边mp[i*m+j+1][n*m+i*m+j+1] = mp1[i][j]。这是我们构造图mp中最关键的一步,正是因为有了这个有向边,我们才可以使用最大流来计算这个题。
  3. 对于地图mp1,枚举每个点pij,如果这个点距离地图边界的距离小于等于d,那么添加边mp[n*m+i*m+j+1][2*m*n+1] = mp1[i][j];同时枚举除pij以外的点pkl,如果pij与pkl之间的距离小于等于d那么添加边mp[n*m+i*m+j+1][k*m+l+1] = max(mp1[i][j], mp1[k][l])。
  4. 对于地图mp2,如果某个点pij 的值mp2[i][j] == ‘L’,那么构造边mp[0][i*m+j+1] = 1。

然后计算从源点到汇点的最大流即可,我使用的Dinic算法。

具体见代码——

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std; const int N = ;
const int M = ; int dis[N];
int cur[N];
bool vis[N];
char mp[][][];
int mp2[N][N];
int n, m, d, t;
int ans, sum; inline int Min(int x, int y)
{
return x < y ? x : y;
} void init()
{
memset(mp, , sizeof(mp));
memset(mp2, , sizeof(mp2));
scanf("%d%d", &n, &d);
scanf("%s", mp[][]);
m = strlen(mp[][]);
sum = ;
ans = ;
for(int i = ; i < n; i++)
{
scanf("%s", mp[][i]);
}
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
{
for(int k = ; k < n; k++)
{
for(int l = ; l < m; l++)
{
int mid1 = abs(i-k)+abs(j-l);
if(mid1 <= d && i*m+j+ != k*m+l+) //点pij到点pkl之间距离小于等于d且不是同一点
{
int mid = Min(mp[][i][j], mp[][k][l]);
mp2[n*m+i*m+j+][k*m+l+] = mid; //从点pij到点pkl的边
}
}
}
mp2[i*m+j+][n*m+i*m+j+] = mp[][i][j]-''; //从点pij到点pij的边
if(i < d || j < d || n-i <= d || m-j <= d) mp2[m*n+i*m+j+][*n*m+] = mp[][i][j]-''; //从点pij到汇点的边
}
}
for(int i = ; i < n; i++)
{
scanf("%s", mp[][i]);
for(int j = ; j < m; j++)
{
if(mp[][i][j] == 'L')
{
mp2[][i*m+j+] = ; //从源点到点pij的边
sum++;
}
}
}
m = *n*m+;
} bool bfs()
{
memset(vis, , sizeof(vis));
queue<int> que;
que.push();
dis[] = ;
vis[] = ;
while(!que.empty())
{
int k = que.front();
que.pop();
for(int i = ; i <= m; i++)
{
if(!vis[i] && mp2[k][i] > )
{
vis[i] = ;
dis[i] = dis[k]+;
que.push(i);
}
}
}
return vis[m];
} int dfs(int x, int val)
{
if(x == m || val == ) return val;
int flow = , minn;
for(int& i = cur[x]; i <= m; i++)
{
if(dis[x]+ == dis[i] && (minn = dfs(i, Min(val, mp2[x][i]))) > )
{
mp2[x][i] -= minn;
mp2[i][x] += minn;
flow += minn;
val -= minn;
if(val == ) break;
}
}
return flow;
} void work() //Dinic算法
{
while(bfs())
{
for(int i = ; i <= m; i++) cur[i] = ;
ans += dfs(, M);
}
} void outit(int tm)
{
sum -= ans;
printf("Case #%d: ", tm);
if(!sum) printf("no lizard was left behind.\n");
else if(sum == ) printf("1 lizard was left behind.\n");
else printf("%d lizards were left behind.\n", sum);
} int main()
{
//freopen("test.in", "r", stdin);
scanf("%d", &t);
for(int tm = ; tm <= t; tm++)
{
init();
work();
outit(tm);
}
return ;
}

最大流入门——

http://www.cnblogs.com/mypride/p/4859453.html

hdu 2732 Leapin' Lizards(最大流)Mid-Central USA 2005的更多相关文章

  1. hdu 2732 Leapin' Lizards 最大流 拆点 建图

    题目链接 题意 给定一张网格,格子中有些地方有柱子,有些柱子上面有蜥蜴. 每个柱子只能承受有限只蜥蜴从上面经过.每只蜥蜴每次能走到相距曼哈顿距离\(\leq k\)的格子中去. 问有多少只蜥蜴能走出网 ...

  2. hdu 2732 Leapin' Lizards (最大流 拆点建图)

    Problem Description Your platoon of wandering lizards has entered a strange room in the labyrinth yo ...

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

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

  4. HDU 2732 Leapin' Lizards(最大流)

    http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意: 给出n行的网格,还有若干只蜥蜴,每只蜥蜴一开始就在一个格子之中,并且给出蜥蜴每次的最大跳跃长度d. ...

  5. HDU - 2732 Leapin' Lizards (拆点最大流)

    题意:有N*M的矩形,每个格点有一个柱子,每根柱子有高度c,允许蜥蜴经过这根柱子c次,开始有一些蜥蜴在某些柱子上,它们要跳出这个矩形,每步最大能跳d个单位,求最少有多少蜥蜴不能跳出这个矩形. 分析:转 ...

  6. HDU 2732 Leapin' Lizards

    网络最大流+拆点.输出有坑!!! #include<cstdio> #include<cstring> #include<string> #include<c ...

  7. HDU 2732 Leapin&#39; Lizards(拆点+最大流)

    HDU 2732 Leapin' Lizards 题目链接 题意:有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是不管怎样都逃不出来的. ...

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

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

  9. Leapin' Lizards [HDU - 2732]【网络流最大流】

    题目链接 网络流直接最大流就是了,只是要拆点小心一个点的流超出了原本的正常范围才是. #include <iostream> #include <cstdio> #includ ...

随机推荐

  1. Spring框架学习之第5节

    request session global-session 三个在web开发中才有意义 如果配置成prototype有点类似于request 如果配置成singleton有点类似于web开发中的gl ...

  2. ./jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory

    Ubuntu 上使用jad,出现上面错误: ./jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot ...

  3. 新环境配置与使用Vim指南

    1.下载源码 git clone git@github.com:vim/vim.git 2.编译 1.安装依赖软件 sudo apt-get install libncurses5-dev libgn ...

  4. What floating point types are available in .NET?

    The C# standard only lists double and float as floating points available (those being the C# shortha ...

  5. [HIHO1323]回文字符串(区间dp)

    题目链接:http://hihocoder.com/problemset/problem/1323 思路:区间dp,按照区间长度枚举所有区间和区间的起始位置.这时也可获取到区间的末位,比对这两个字符是 ...

  6. [HDOJ2639]Bone Collector II(第k优01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:求01背包的第k优解 dp(i, j)表示容量为j时的i优解 对于第二维的操作和01背包几 ...

  7. hibernate学习笔记4---HQL、通用方法的抽取实现

    一.通用方法的抽取实现 由于hibernate中对增删改查的一切操作都是面向对象的,所以将增删改查抽取成通用方法,以满足不同的表的增删改查操作,简化jdbc代码. 具体例子如下: package cn ...

  8. MFC弹出菜单隐藏解决

    http://social.msdn.microsoft.com/Forums/en-US/5482103e-272b-4c9f-bac4-be15f14782bd/cmfcmenubar-remov ...

  9. java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.<init>(Ljava/lang/Class;)V

    相应我,是因为你SPRING MVC的包没有加全.你可以新建一个WEB项目.加入SPRING 3.0 的所有包.主要是WEB类的.就可以解决这个问题了.关键就是少包.特别是你的项目原来是SRPING ...

  10. DELPHI 里面的迭代

    迭代(Iiterator)的作用:遍历一个集合(Collections)的每一个元素(item). delphi 2005之后新加入一种 for .. in .. 遍历语句,支持String,Set, ...