【解题报告】 Leapin' Lizards HDU 2732 网络流
【解题报告】 Leapin' Lizards HDU 2732 网络流
题外话
在正式讲这个题目之前我想先说几件事
1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目,而且还给他们分门别类,并且标注了难度,感觉挺好的,网址是[夏天的风](https://blog.csdn.net/shahdza/article/details/7779537)
2. 这道题有个坑点!!!!
正题
首先,当然是直接贴上[题目](http://acm.hdu.edu.cn/showproblem.php?pid=2732)的链接,题号是2732。
然后接下来是CSDN的链接(https://blog.csdn.net/Liang_Si_FFF/article/details/84992526)。
题目大意
* 现在给你一个n*m的矩阵,每一个点表示一根柱子,柱子之间没有道路。
* 在某些柱子上面,会有蜥蜴,(每一个柱子上面最多一个蜥蜴),现在他们被困在那里了。但是每个蜥蜴都可以跳,跳的距离为d,所以只要两根柱子的距离不超过d,他们就可以跳到相邻的柱子上面。如果一个蜥蜴可以跳出矩阵外面,那么它就得救了。坑点来了!不知道是我题目没有看清楚的缘故,还是题目没有明说的缘故,这里的距离指的是曼哈顿距离。要不是我看了别人的题解,我还会一直困在样例数据呢
* 但是,每一根柱子的质量都不是很好,都有一个寿命值(整数)。每当有一个蜥蜴从这跟柱子起跳,这跟柱子的寿命值就会减一,减到0之后柱子就断了。(只有起跳的时候会减,如果有一个蜥蜴跳到这上面,是不会有事的)
* 现在问你,不能获救的蜥蜴最少是多少了?
* 坑点二:输出数据的时候,不仅要注意有和没有,而且还要注意单复数。不过还好,我一开始就注意到了。比如下面:
Case #1: 2 lizards were left behind.
Case #2: no lizard was left behind.
Case #3: 3 lizards were left behind.
Case #4: 1 lizard was left behind.
构图方法
1. 拆点,将每一个点拆成两个点,分别叫做start和end,start,然后再start之间连一条容量为寿命值的边,表示这个柱子最多只能跳几次。
2. 如果一个蜥蜴可以从柱子u跳到柱子v上面,则从u~end~连一条边到v~start~,(容量随意,只要大于u的寿命值就行)表示蜥蜴能够从这个柱子跳到另一个柱子。
3. 如果一个蜥蜴能够从柱子u跳出这个矩阵,那么就从u~end~连一条边到汇点T(同样容量随意,只要大于u的寿命值就行)
4. 如果某一个柱子u上面在初始状态下是有蜥蜴的,那么从头源点S连一条边到u~start~,容量为1,表示这个柱子上面只有一个蜥蜴(毕竟题目里面说了嘛,每根柱子上面最多只有一个蜥蜴)
5. 这个图的最大流就是能够逃出去的蜥蜴的数量。所以提前算出有多少了蜥蜴之后,减去最大流,就是不能获救的蜥蜴的个数。
AC代码
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int INF=;
const int N=;
const int M=N*N;
int Head[N],Next[M],Ver[M],Edge[M],tot=;//利用前向星储存
int D[N];//dinic算法需要用到的深度值
int map[][];//用来存每一个柱子的寿命值
int mark[][];//给每一个柱子标号
int S=,T=;
char temp[];//由于题目用字符串输入,所以弄一个字符数组
void add(int,int,int);//连边函数
bool bfs(void);//dinic算法数深度函数
int dinic(int,int);//就是dinic
int min(int,int);
int max(int,int);
int abs(int);
int main()
{
int Case;
scanf("%d",&Case);//总共要Case组数据
for(int cnt=;cnt<=Case;cnt++)
{
memset(Head,,sizeof(Head));
int n,d,m=;
scanf("%d%d",&n,&d);
getchar();
for(int i=;i<=n;i++)
{
fgets(temp,,stdin);
if(!m) m=strlen(temp)-;
for(int j=;j<=m;j++)
map[i][j]=temp[j-]-'';
}
int k=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
mark[i][j]=k++;//这个地方就是给每一根柱子都标一个号
//然后就用这个号码来标注柱子u的u_start,用u_start+T表示
//u_end
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(map[i][j])
{
add(mark[i][j],mark[i][j]+T,map[i][j]);
if(i-d<||i+d>n||j-d<||j+d>m)
add(mark[i][j]+T,T,map[i][j]);
int L=min(m,j+d),U=min(n,i+d);
for(int I=max(,i-d);I<=U;I++)
for(int J=max(,j-d);J<=L;J++)
if(map[I][J]&&(I!=i||J!=j)&&(abs(I-i)+abs(J-j)<=d))
add(mark[i][j]+T,mark[I][J],map[i][j]); }
}
int sum=;
for(int i=;i<=n;i++)
{
fgets(temp,,stdin);
for(int j=;j<=m;j++)
if(temp[j-]=='L')
{
add(S,mark[i][j],);
sum++;
}
}
int max_flow=;
while(bfs()) max_flow+=dinic(S,INF);
int left=sum-max_flow;
if(left==)
printf("Case #%d: no lizard was left behind.\n",cnt);
else if(left==)
printf("Case #%d: 1 lizard was left behind.\n",cnt);
else printf("Case #%d: %d lizards were left behind.\n",cnt,left);
}
return ;
}
int dinic(int x,int flow)
{
if(x==T) return flow;
int rest=flow;
for(int p=Head[x];rest&&p;p=Next[p])
{
if(D[Ver[p]]==D[x]+&&Edge[p])
{
int k=dinic(Ver[p],min(rest,Edge[p]));
if(!k) D[Ver[p]]=;
Edge[p]-=k;
Edge[p^]+=k;
rest-=k;
}
}
return flow-rest;
}
bool bfs(void)
{
memset(D,,sizeof(D));
queue <int> q;
q.push(S);
D[S]=;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int p=Head[x];p;p=Next[p])
if(!D[Ver[p]]&&Edge[p])
{
D[Ver[p]]=D[x]+;
if(Ver[p]==T) return ;
q.push(Ver[p]);
}
}
return ;
}
void add(int u,int v,int c)
{
Next[++tot]=Head[u],Head[u]=tot,Edge[tot]=c,Ver[tot]=v;
Next[++tot]=Head[v],Head[v]=tot,Edge[tot]=,Ver[tot]=u;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
inline int abs(int x)
{
return x<?-x:x;
}
【解题报告】 Leapin' Lizards HDU 2732 网络流的更多相关文章
- K - Leapin' Lizards HDU - 2732 网络流
题目链接:https://vjudge.net/contest/299467#problem/K 这个题目从数据范围来看可以发现是网络流,怎么建图呢?这个其实不是特别难,主要是读题难. 这个建图就是把 ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- Leapin' Lizards(hdu 2732)
Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- Leapin' Lizards [HDU - 2732]【网络流最大流】
题目链接 网络流直接最大流就是了,只是要拆点小心一个点的流超出了原本的正常范围才是. #include <iostream> #include <cstdio> #includ ...
- K - Leapin' Lizards - HDU 2732(最大流)
题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有 ...
- Leapin' Lizards HDU - 2732 (恶心的建图。。)
这道题其实不难...就是建图恶心了点....emm... 题意: 多源多汇 + 拆边 青蛙跳柱子, 每根柱子都有一定的承载能力, 青蛙跳上去之后柱子的承载能力就会减一,跳到边界就能活 跳不到就over ...
- [ZOJ2341]Reactor Cooling解题报告|带上下界的网络流|无源汇的可行流
Reactor Cooling The terrorist group leaded by a well known international terrorist Ben Bladen is bul ...
- HDU 2732 Leapin' Lizards(拆点+最大流)
HDU 2732 Leapin' Lizards 题目链接 题意:有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是不管怎样都逃不出来的. ...
- HDU 4303 Hourai Jeweled 解题报告
HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...
随机推荐
- 辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作
对于mysql中的数据碎片,事实上和我们删除数据是息息相关的,删除数据的时候必定会在数据文件里造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间.假设在一段时间内的大量的删除操作,会 ...
- 汉澳Sinox2014X64server高级桌面服务器版操作系统公布
汉澳Sinox2014X64server高级桌面服务器版操作系统公布 当你在现代城市夜空中看到一道闪电.屏幕中央闪过几个图形,转眼间变成美轮美奂的紫色空中天国,说明你来到了汉澳sinox2014世 ...
- node.js下操作cookie
cookie,又是cookie.工作中与cookie打交道很多次,不过时间跨度也大,每总结多一次,就加深了解多一点. cookie,一定是放在浏览器中的,用于浏览器保存一些小额度的内容.每次我们去访问 ...
- expect安装测试-批量用户管理
安装: yum list | grep expect yum install expect 批量创建用户: ansible mysqldb -m user -a 'name=ansible state ...
- ClipboardEvent.clipboardData
ClipboardEvent.clipboardData https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/clipboa ...
- android studio中xml文件代码提示问题
在系统控件中输入“a”能提示出android:id等所有属性.而在第三方库的控件中输入“a”只会提示“appNs”,但如果手动写app:id="@+id/aaa"系统也是可以识别的 ...
- bzoj 4590: [Shoi2015]自动刷题机
好恶心.. 二分上界到100000LL*1000000000LL %_% #include<cstdio> #include<iostream> #include<cs ...
- innerxml and outerxml
xml文件如下 <root> <a></a> <b></b> <c></c> <a></a> ...
- 硬盘-RAID 5组建
没发正文之前本人先声明一下----本文是转载 这篇文章简直是太精彩了,呵呵 ,实在是忍不住了,一定要贴出来,让大家分享! 原作者:唐华 责任编辑:xiexiaojin 我们生活在一个历史记录在硬盘上的 ...
- FPC报价模块配置 UpdateCommand影响了预期 1 条记录中的 0 条 解决办法
今天在增加P4厂 FPC报价模块配置,增加刚挠信息节点,在保存时报错:UpdateCommand影响了预期 1 条记录中的 0 保存时使用:SqlDataAdapter批量更新DataTable,怎么 ...