HDU-2732 Leapin' Lizards 最大流

  题目意思是有一些蜥蜴在一个迷宫里面,求这些蜥蜴还有多少是无论如何都逃不出来的。题目只给定一个行数,一个最远能够跳跃的距离,列数是不确定的(题目告知列数小于等于20),但是数据一定会是一个矩阵。每只蜥蜴有一个初始的位置,题目保证这些位置都有一些柱子,每次蜥蜴从一个位置跳到另外一个位置的时候,就会由于反作用力使得一根柱子倒下。很显然,这一题,可以用网络流来求解,那么如何去构图呢?首先我们要确定一个贪心思想,即如果从某一根柱子能够直接跳到迷宫的外面,那么我们就将这个点连接到汇点,而不用将这个点连接到其他的点了。对于哪些不能跳出去但是又有柱子的点,那么我们就去按照跳跃距离搜寻有没有其他的柱子能够去跳跃,如果能够找到的话,那么连接这两点,并且将容量控制为弧尾节点的柱子数,也正是由于一条弧只能够约束一个顶点,所以我们需要进行拆点,点内之间流量为本身柱子数。题目给定的第二个矩阵其实就是用来确定源点的。该题输入要小心,要符合英语语法~~

  代码如下:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#define RE(x) ((x)^1)
#define CP(x) ((x)+500)
#define INF 0x3fffffff
using namespace std;
// 把所有的L点都视作源点,超级源点与该点的容量为1
// 并将所有的能够脱离的有柱子的点视作汇点,与超级汇点的容量为弧尾柱子的数目
// 将所有的能够相连的柱子都相连,容量为弧尾的柱子数int N, M, MM, dis[1000], head[1000], idx;const int source = 980, sink = 981;char G[25][25], S[25][25];struct Edge
{int v, cap, next;
}e[20000];void init()
{idx = -1;memset(head, 0xff, sizeof (head));
}inline int to(int x, int y)
{return x*M+y;
}inline bool out(int x, int y)
{int u = x+1, d = N-x, l = y+1, r = M-y;int dist = min(u, min(d, min(l, r)));return dist <= MM;
}inline bool judge(int x, int y)
{if (x < 0 || x >= N || y < 0 || y >= M) {return false;}else if (!G[x][y]) {return false;}return true;
}void insert(int a, int b, int c)
{++idx;e[idx].v = b, e[idx].cap = c;e[idx].next = head[a], head[a] = idx;
}void build(int x, int y)
{int xx, yy;if (G[x][y]) {insert(to(x, y), CP(to(x,y)), G[x][y]);insert(CP(to(x, y)), to(x,y), G[x][y]);if (out(x, y)) {insert(CP(to(x, y)), sink, INF);insert(sink, CP(to(x, y)), 0);}else {for (int i = -MM; i <= MM; ++i) {for (int j = -(MM-abs(i)); j <= (MM-abs(i)); ++j) {xx = x + i, yy = y + j;if (judge(xx, yy) && !(x == xx && y == yy)) {insert(CP(to(x, y)), to(xx, yy), G[x][y]);insert(to(xx, yy), CP(to(x, y)), 0);}}}}}
}bool spfa(int u)
{queue<int>q;memset(dis, 0xff, sizeof (dis));dis[u] = 0;q.push(u);while (!q.empty()) {u = q.front();q.pop();for (int i = head[u]; i != -1; i = e[i].next) {if (dis[e[i].v] == -1 && e[i].cap > 0) {dis[e[i].v] = dis[u] + 1;q.push(e[i].v);}}}return dis[sink] != -1;
}int dfs(int u, int flow)
{if (u == sink) {return flow;}int tf = 0, sf;for (int i = head[u]; i != -1; i = e[i].next) {if (dis[u]+1 == dis[e[i].v] && e[i].cap > 0 && (sf = dfs(e[i].v, min(flow-tf, e[i].cap)))) {e[i].cap -= sf, e[RE(i)].cap += sf;tf += sf;if (tf == flow) {return flow;}}}if (!tf) {dis[u] = -1;}return tf;
}int dinic()
{int ans = 0;while (spfa(source)) {ans += dfs(source, INF);}return ans;
}int main()
{int T, ca = 0, ans;scanf("%d", &T);while (T--) {init();ans = 0;scanf("%d %d", &N, &MM); // M为最长的步长for (int i = 0; i < N; ++i) {scanf("%s", G[i]);}M = strlen(G[0]);for (int i = 0; i < N; ++i) {for (int j = 0; j < M; ++j) {G[i][j] -= '0';build(i, j);}}for (int i = 0; i < N; ++i) {scanf("%s", S[i]);for (int j = 0; j < M; ++j) {if (S[i][j] == 'L') {++ans;insert(source, to(i, j), 1);insert(to(i, j), source, 0);}}}ans -= dinic();printf("Case #%d: ", ++ca);if (!ans) {puts("no lizard was left behind.");}else if (ans == 1){printf("%d lizard was left behind.\n", ans);}else {printf("%d lizards were left behind.\n", ans);}}return 0;
}

转载于:https://www.cnblogs.com/Lyush/archive/2012/07/06/2579761.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

canvas动画简单操作

canvas动画 小球滚动效果 关键api&#xff1a; window.requestAnimationFrame(draw) 会递归调用draw函数&#xff0c;替代setIntervalvar x 20; var speed 4; //电脑的帧率是1秒钟60Hz&#xff0c; 就相当于一秒钟可以播放60张图片&#xff0c;就相当于播放一张图片使用16.…

编译相关

编译的过程 &#xff1a; 1. 词法分析&#xff0c;程序被扫描成&#xff1a;关键字&#xff0c;标识符&#xff0c;字面量和特殊符号这些记号。 2. 语法分析&#xff0c;对记号进行语法分析产生语法树。&#xff08;代码最终由表达式组合&#xff09; 3. 语义分析&#xff0c;经…

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得不错&#xff0c;您也需要设置公司流程的权利&#xff0c;以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍&#xff08;后面内容的RN就是指react-native&#xff09; 由facebook公司推出的&#xff0c;基于react&#xff0c;能开发原生app 原理&#xff1a; 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码&#xff0c;翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手&#xff0c;帮朋友整的。朋友经常出国&#xff0c;所以指定要越狱&#xff0c;装墙外软件。 大sim卡是不支持的&#xff0c;还好商家给了剪卡器。首先发现移动卡不支持&#xff0c;别告诉我欢迎门&#xff0c;我用的就是19位的ICCID&#xff0c;反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名&#xff0c;那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样&#xff1f; //a.如果变量有值&#xff0c;那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition&#xff1a;允许css属性值在一定的时间区内平滑的过渡。 transition-property&#xff1a;变换延续的时间 transition-duration&#xff1a;在延续时间段 transition-timing-function&#xff1a;变换速度变化 transition-delay&#xff1a;变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…

Tiny Wings 为什么能迅速成为 iOS App Store 付费应用第一名?

Tiny Wings 不知是有意无意&#xff0c;完美的利用了人的性意识。有节奏感的上上下下&#xff0c;找准G点后毫不犹豫的迎头猛扎下去。期待自己拥有绝佳技巧&#xff0c;不放过任何一次能high起来的机会。飞上天触到云的瞬间high得全身淋漓畅快&#xff0c;连续多触云几次基本上…

node.js 搭建http调取 mysql数据库中的值

首先&#xff0c;我们先在数据库中创建两个表t_news,t_news_type;插入数据&#xff1a; 然后我们再写代码&#xff1a; //加载模块express var express require("express"); var fs require("fs"); //加载路径 var url require("url"); //加…

Spring Caching抽象和Google Guava Cache

Spring为缓存昂贵的方法调用提供了强大的开箱即用支持。 这里详细介绍了缓存抽象。 我的目的是要介绍Spring现在为框架的4.0版本提供的较新的缓存实现之一-使用Google Guava Cache 简而言之&#xff0c;请考虑一种具有几种慢速方法的服务&#xff1a; public class DummyBoo…

NHibernate.3.0.Cookbook第三章第9节的翻译

Using stateless sessions 使用无状态会话 当进行大量数据处理的时候,可能会放弃使用一些高级特性,而使用更接近底层的API来提高性能.在NHibernate中,这种高性能的底层API就是无状态的会话.本节介绍如何使用无状态会话来更新movie对象的价格. 准备 使用第一章的Eg.Core和第二章…

致电以验证您的JavaFX UI的响应能力

最近&#xff0c;Jim Weaver在他的Surface Pro上为演示安装了我的小图片索引应用“ picmodo”&#xff0c;并且GUI变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&#xff1a; 我认为&#xff0c;即使调整大小行为和预期一样工作&#xff0c;UI也绝…

上周热点回顾(7.9-7.15)

热点随笔&#xff1a; 2012五大主流浏览器 HTML5 和 CSS3 兼容性大比拼&#xff08;梦想天空&#xff08;山边小溪&#xff09;&#xff09; 原创&#xff1a;让密码不再被遗忘 - 在web中尝试图形口令&#xff01;&#xff08;网无忌&#xff09; 构建一个Outlook风格漂亮界面…

vuex 管理vue-router的传值

假设有这样的一种情况&#xff0c;在两个组件中。一个组件【A】主要是比如说放表格数据&#xff0c;而另外一个组件【B】是专门用来向组件A的表格添加数据的表单。这个时候就是两个兄弟组件之间传递数据了。首先想到的是使用兄弟组件传递数据的方法&#xff1a; 新建一个中间件…