题目链接:点击查看

题目大意:给出两个n*m的迷宫,第一个迷宫中表示每个柱子的耐久度,第二个迷宫表示的是每一只蜥蜴的位置,现在给出每只蜥蜴可以跳跃的最大曼哈顿距离,规定跳出迷宫边界就可以逃离迷宫,现在问最少有多少只蜥蜴会被困在迷宫中

题目分析:因为每个点都有点权,所以不难想到需要进行拆点操作,题目问最少有多少只蜥蜴会被困在迷宫中,换句话说就是多少只蜥蜴可以逃离迷宫,那么建立好网络流的图后直接跑最大流就好了,具体建图方法应该不难想:

  1. 源点->每一只蜥蜴,流量为1
  2. 每一个柱子的入点->每一个柱子的出点,流量为耐久度
  3. 每一只蜥蜴->当前柱子的入点,流量为1
  4. 每个柱子的出点->可到达的柱子入点,流量为无穷大
  5. 可逃离迷宫的柱子的出点->汇点,流量为无穷大

建好图后直接跑最大流就好了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=25*25*3;struct Edge
{int to,w,next;
}edge[N*N];//边数int head[N],cnt,n,m;char maze[25][25],maze2[25][25];//maze:迷宫 maze2:蜥蜴int get_id(int x,int y,int k)//k=0:蜥蜴,k=1:柱子1,k=2:柱子2
{return (x-1)*m+y+k*n*m;
} void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;int kase=0;while(w--){init();int d,st=N-1,ed=st-1;scanf("%d%d",&n,&d);for(int i=1;i<=n;i++)scanf("%s",maze[i]+1);for(int i=1;i<=n;i++)scanf("%s",maze2[i]+1);m=strlen(maze[1]+1);int tot=0;//蜥蜴数量 for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(maze2[i][j]=='L'){tot++;addedge(st,get_id(i,j,0),1);//st->蜥蜴 addedge(get_id(i,j,0),get_id(i,j,1),1);//蜥蜴->柱子1 }}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(maze[i][j]!='0'){addedge(get_id(i,j,1),get_id(i,j,2),maze[i][j]-'0');//柱子1->柱子2for(int dx=-d;dx<=d;dx++){for(int dy=-d;dy<=d;dy++){if(abs(dx)+abs(dy)>d)continue;if(!dx&&!dy)continue;int nx=i+dx;int ny=j+dy;if(nx<=0||nx>n||ny<=0||ny>m){addedge(get_id(i,j,2),ed,inf);//柱子2->ed continue;}if(maze[nx][ny]!='0')addedge(get_id(i,j,2),get_id(nx,ny,1),inf);//柱子2->柱子1 }}}}}int ans=solve(st,ed);if(tot-ans>1)printf("Case #%d: %d lizards were left behind.\n",++kase,tot-ans);else if(tot-ans==1)printf("Case #%d: 1 lizard was left behind.\n",++kase);elseprintf("Case #%d: no lizard was left behind.\n",++kase);}return 0;
}

HDU - 2732 Leapin' Lizards(最大流+思维建边)相关推荐

  1. hdu 2732 Leapin' Lizards (经典网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2732 Your platoon of wandering lizards has entered a ...

  2. HDU 2732 Leapin' Lizards

    传送门 这道题应用了网络流,主要考的是怎么转化为网络流求解,重点是怎么建图. 题意是给你一个n*m网格,每个格子可能有一个柱子,也可能没柱子,每个柱子上有一个最大跳出次数,用完了这个柱子就废了,每个柱 ...

  3. HDU - 3338 Kakuro Extension(最大流+思维建边)

    题目链接:点击查看 题目大意:填数游戏,给出一个n*m的矩阵,矩阵中存在三种方块: 纯黑的方块:没什么用 纯白的方块:等待我们填数字的方块 黑色方块上有数字: 左下角有数字:当前黑色方块下面的白色方块 ...

  4. HDU Problem - 2732 Leapin' Lizards(最大流,拆点建边)

    题目链接 Problem Description Your platoon of wandering lizards has entered a strange room in the labyrin ...

  5. Leapin' Lizards 【HDU - 2732】【最大流】

    题目链接 题意:就是给你这样的N*M的点(其中M还没有给出,但是M可以算得),然后先输出N.D,N行,D是每个青蛙能跳的距离(欧拉距离,以为是曼哈顿距离的我WA了两发-- QAQ),然后是第一张N*M ...

  6. HDU - 4292 Food(最大流+思维建边)

    题目链接:点击查看 题目大意:作为食堂管理人,现在有n个学生需要打饭,每个学生需要一个饮料和食物才能满足,每个学生可以同时接受多种不同的食物和饮料,现在给出每种食物和饮料的个数,问最多能让多少学生满足 ...

  7. HDU - 5988 Coding Contest(最大费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个点和m条边,每个点有ai个人和bi份食物,每条边最多能通过ci个人,以及除了第一个人之外,其他人通过每条边触电的概率为pi,在以上约束下,要求每个人都必须吃到一份 ...

  8. HDU - 3605 Escape(二分图多重匹配-网络流最大流+思维建边+状态压缩)

    题目链接:点击查看 题目大意:到世界末日了,现在人们要逃离去其他的星球,现在给出n个人以及m个星球,再给出每个人可以前往的星球,最后给出每个星球的容量,题目问最多能让多少个人逃离 题目分析:这个题读完 ...

  9. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:现在有n天需要志愿者,每一天需要招募的人数是Ai个人,现在有m类志愿者,每类志愿者可以在[l,r]天内被招募,需要花费的代价为Ci,现在需要安排一种招募方式,可以使得总花 ...

最新文章

  1. JAVA 之反射(基础概念) 几个主要常用的重要的方法
  2. linux 下的 initrd ramdisk
  3. wxWidgets:wxRibbonBar类用法
  4. filter过滤器实现验证跳转_返回验证结果
  5. Apache Druid Console 远程命令执行漏洞
  6. 什么高大填空四个字动人_雅思考试的技巧?雅思听力part4填空做题技巧分享
  7. 配置监控中心-及管理平台
  8. 电子技术基础(三)__具有无关项逻辑函数的化简
  9. 网页精美动效/动画制作 按钮鼠标悬浮动效基础 01《炫彩网页 iVX 无代码动效/动画制作》
  10. 声散射 matlab,逆向运用Fourier衍射定理快速预报水中目标的声散射特性
  11. 钉钉安装需要管理员权限报错解决办法
  12. 互联网实习面试的一些心得(非计算机专业)
  13. 2021极术通讯-CSL-YOLO | 超越Tiny-YOLO V4,全新设计轻量化YOLO模型实现边缘实时检测
  14. 网站使用手机相机_手机如何修改证件照片大小和分辨率
  15. Python_楼梯数计算
  16. RobotFramework-自定义远程java关键字库能否返回Map类型
  17. 微信小程序授权_微信小程序授权验证码什么意思
  18. 【蓝牙CC2541】调试蓝牙收发功能
  19. 给你最给力最专业的自我价值观测试……重新认识我是谁
  20. 重温WIN32 API ------ 窗口上绘制位图文件

热门文章

  1. java finereport_java报表FineReport_JS整理
  2. MySQL服务的启动与停止-使用命令行工具
  3. MySQL联合查询介绍
  4. 什么是事务、半事务消息?怎么实现的?
  5. Redis安装-win-linux-mac
  6. 基于JWT的API权限校验:需求分析
  7. Spring Boot整合Spring Data Redis-测试整合
  8. h5的fetch方法_你不需要jQuery(三):新AJAX方法fetch()
  9. linux 中 ~/.和$
  10. 【图文详解】Mysql8.0安装教程