【BZOJ1066】 [SCOI2007]蜥蜴
Description
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。
Input
输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
Output
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
Sample Input
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........
Sample Output
HINT
100%的数据满足:1<=r, c<=20, 1<=d<=4
Solution
最大流。
拆点,将一个点拆成两个点,一个点表示进来,另一个点表示出去。进来出去的点的个数不能超过数字个数。然后距离d以内的连一下最后流一下就好了。
Code
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <queue>
- #ifdef WIN32
- #define LL "%I64d"
- #else
- #define LL "%lld"
- #endif
- #ifdef CT
- #define debug(...) printf(__VA_ARGS__)
- #define setfile()
- #else
- #define debug(...)
- #define filename ""
- #define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout)
- #endif
- #define R register
- #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
- #define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
- #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
- #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
- #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
- #define cabs(_x) ((_x) < 0 ? (- (_x)) : (_x))
- char B[ << ], *S = B, *T = B;
- inline int F()
- {
- R char ch; R int cnt = ; R bool minus = ;
- while (ch = getc(), (ch < '' || ch > '') && ch != '-') ;
- ch == '-' ? minus = : cnt = ch - '';
- while (ch = getc(), ch >= '' && ch <= '') cnt = cnt * + ch - '';
- return minus ? -cnt : cnt;
- }
- #define maxn 30
- #define maxp 10010
- #define maxm 1000010
- #define inf 0x7fffffff
- char mp[maxn][maxn], mp2[maxn][maxn];
- int id[maxn][maxn][], id2[maxn][maxn];
- struct Edge
- {
- Edge *next, *rev;
- int to, cap;
- }*last[maxp], *cur[maxp], e[maxm], *ecnt = e;
- int dep[maxp], s, t, ans;
- std::queue<int> q;
- inline void link(R int a, R int b, R int w)
- {
- // printf("%d %d %d\n", a, b, w );
- *++ecnt = (Edge) {last[a], ecnt + , b, w}; last[a] = ecnt;
- *++ecnt = (Edge) {last[b], ecnt - , a, }; last[b] = ecnt;
- }
- inline bool bfs()
- {
- memset(dep, -, sizeof (dep));
- dep[t] = ; q.push(t);
- while (!q.empty())
- {
- R int now = q.front(); q.pop();
- for (R Edge *iter = last[now]; iter; iter = iter -> next)
- {
- R int pre = iter -> to;
- if (dep[pre] == - && iter -> rev -> cap)
- {
- dep[pre] = dep[now] + ;
- q.push(pre);
- }
- }
- }
- return dep[s] != -;
- }
- int dfs(R int x, R int f)
- {
- if (x == t) return f;
- R int used = ;
- for (R Edge* &iter = cur[x]; iter; iter = iter -> next)
- {
- R int pre = iter -> to;
- if (iter -> cap && dep[x] == dep[pre] + )
- {
- R int v = dfs(pre, dmin(iter -> cap, f - used));
- iter -> cap -= v;
- iter -> rev -> cap += v;
- used += v;
- if (f == used) return f;
- }
- }
- if (!used) dep[x] = -;
- return used;
- }
- inline void dinic()
- {
- while (bfs())
- {
- memcpy(cur, last, sizeof last);
- ans += dfs(s, inf);
- }
- }
- int main()
- {
- // setfile();
- R int n = F(), m = F(), k = F(), cnt = , tot = ;
- for (R int i = ; i <= n; ++i, getc())
- for (R int j = ; j <= m; ++j)
- {
- mp[i][j] = getc();
- if (mp[i][j] > '')
- {
- id[i][j][] = ++cnt;
- id[i][j][] = ++cnt;
- link(cnt - , cnt, mp[i][j] - '');
- }
- }
- // for (R int i = 1; i <= n; ++i) puts(mp[i] + 1);
- for (R int i = ; i <= n; ++i, getc())
- for (R int j = ; j <= m; ++j)
- {
- mp2[i][j] = getc();
- mp2[i][j] == 'L' ? ++tot : ;
- }
- t = ++cnt;
- for (R int i = ; i <= n; ++i)
- for (R int j = ; j <= m; ++j)
- if (mp[i][j] > '')
- {
- for (R int ii = -k; ii <= k; ++ii)
- for (R int jj = -k; jj <= k; ++jj)
- if (i + ii > && i + ii <= n && j + jj > && j + jj <= m && !(ii == && jj == ) && mp[i + ii][j + jj] > '' && ii * ii + jj * jj <= k * k)
- link(id[i][j][], id[i + ii][j + jj][], inf);
- if (dmin(i, n - i + ) <= k || dmin(j, m - j + ) <= k)
- link(id[i][j][], t, inf);
- }
- for (R int i = ; i <= n; ++i)
- for (R int j = ; j <= m; ++j)
- if (mp2[i][j] == 'L')
- link(s, id[i][j][], );
- dinic();
- printf("%d\n", tot - ans );
- return ;
- }
- /*
- 5 8 2
- 00000000
- 02000000
- 00321100
- 02000000
- 00000000
- ........
- ........
- ..LLLL..
- ........
- ........
- */
【BZOJ1066】 [SCOI2007]蜥蜴的更多相关文章
- BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】
BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...
- bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...
- bzoj1066: [SCOI2007]蜥蜴(最大流)
1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...
- BZOJ1066 [SCOI2007]蜥蜴
首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...
- [bzoj1066] [SCOI2007] 蜥蜴 - 网络流
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个 ...
- BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
- [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴
[BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥 ...
- 【bzoj1066】【luogu2472】[SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上 ...
随机推荐
- Oracle中的=:
dept_code=:dCode =:在这里的意思是变量绑定
- 浅析射线检测 raycast 的使用 !Cocos Creator 3D !
哎呀?为什么我设置了节点点击回调没反应呀? 记得在写小鸡拍拍的时候遇到一个问题,想要捕捉排球的点击事件,按照 2d 的写法,给3d 节点添加 node 事件,结果点了没反应.代码大概是以下的样子. t ...
- Websocket --(3)实现
今天介绍另外一种websocket实现方式,结合了spring MVC,并完善了第二节所提到做一个简单的登录认证用来识别用户的名称.界面继续沿用第二节的布局样式,同时增加上线和下线功能. 参考了 ht ...
- locust 的几种写法及部分内容说明
第一种 ********************************** from locust import HttpLocust, TaskSet, task import json ...
- 关于float的小奥秘
一. float 存储方式 1.1. float 占四个字节 1.2. 浮点数构成 1.2.1. 无论是单精度还是双精度在存储中都分为三个部分: <1>. 符号位(Sign) : 0代表正 ...
- C++中组合和继承的概念及意义
1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程<设计模式>中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时, ...
- 分位数回归及其Python源码
分位数回归及其Python源码 天朗气清,惠风和畅.赋闲在家,正宜读书.前人文章,不得其解.代码开源,无人注释.你们不来,我行我上.废话少说,直入主题.o( ̄︶ ̄)o 我们要探测自变量 与因变量 的关 ...
- Java Web开发技术教程入门-JSP基本语法和九大内置对象
这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...
- HashMap、HashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、WeakHashMap区别
1. HashMap 标准链地址法实现(下图).数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时 ...
- MySQL数据库入门备份数据库
MySQL数据库入门——备份数据库 一提到数据,大家神经都会很紧张,数据的类型有很多种,但是总归一点,数据很重要,非常重要,因此,日常的数据备份工作就成了运维工作的重点中的重点的重点....... ...