BZOJ1066 [SCOI2007]蜥蜴
首先。。。这是道(很水的)网络流
我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳
但是还有柱子高度的限制,于是把柱子拆点为p1和p2,p1向p2连边,边权为柱子高度
对于相距(注意!是欧几里得距离!)小于d的两个柱子p和q,q2向p1连边,p2向q1连边,边权为inf
S向有蜥蜴的柱子的p1连边,边权为1,可以一步跳出去的柱子p2向T连边,边权为inf
跑最大流即可
- /**************************************************************
- Problem: 1066
- User: rausen
- Language: C++
- Result: Accepted
- Time:136 ms
- Memory:12656 kb
- ****************************************************************/
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N = 1e3 + ;
- const int M = N * N;
- const int inf = 1e9;
- struct edge {
- int next, to, f;
- edge(int _n = , int _t = , int _f = ) : next(_n), to(_t), f(_f) {}
- } e[M];
- int n, m, D, cnt_p, S, T, ans;
- int first[N], tot = ;
- int w[][];
- int d[N], q[N];
- inline void Add_Edges(int x, int y, int f) {
- e[++tot] = edge(first[x], y, f), first[x] = tot;
- e[++tot] = edge(first[y], x, ), first[y] = tot;
- }
- #define y e[x].to
- #define p q[l]
- bool bfs() {
- static int l, r, x;
- memset(d, -, sizeof(d));
- d[q[] = S] = ;
- for (l = r = ; l != r + ; ++l)
- for (x = first[p]; x; x = e[x].next)
- if (!~d[y] && e[x].f) {
- d[q[++r] = y] = d[p] + ;
- if (y == T) return ;
- }
- return ;
- }
- #undef p
- int dfs(int p, int lim) {
- if (p == T || !lim) return lim;
- int x, tmp, rest = lim;
- for (x = first[p]; x && rest; x = e[x].next)
- if (d[y] == d[p] + && ((tmp = min(e[x].f, rest)) > )) {
- rest -= (tmp = dfs(y, tmp));
- e[x].f -= tmp, e[x ^ ].f += tmp;
- if (!rest) return lim;
- }
- if (rest) d[p] = -;
- return lim - rest;
- }
- #undef y
- inline int Dinic() {
- int res = ;
- while (bfs())
- res += dfs(S, inf);
- return res;
- }
- template <class T> T sqr(T x) {
- return x * x;
- }
- #define in(x, y) w[x][y] * 2 - 1
- #define out(x, y) w[x][y] * 2
- int main() {
- int i, j, k, l;
- char ch;
- scanf("%d%d%d", &n, &m, &D);
- for (cnt_p = , i = ; i <= n; ++i)
- for (j = ; j <= m; ++j) {
- ch = getchar();
- while (ch < '' || ch > '') ch = getchar();
- w[i][j] = ++cnt_p;
- if (ch != '') Add_Edges(in(i, j), out(i, j), ch - '');
- }
- S = cnt_p * + , T = S + ;
- for (i = ; i <= n; ++i)
- for (j = ; j <= m; ++j)
- for (k = ; k <= n; ++k)
- for (l = ; l <= m; ++l)
- if (sqr(i - k) + sqr(j - l) <= D * D && ((i != k) || (j != l)))
- Add_Edges(out(i, j), in(k, l), inf);
- for (i = ; i <= n; ++i)
- for (j = ; j <= m; ++j) {
- ch = getchar();
- while (ch != '.' && ch != 'L') ch = getchar();
- if (ch == 'L') ++ans, Add_Edges(S, in(i, j), );
- if (i <= D || j <= D || i > n - D || j > m - D)
- Add_Edges(out(i, j), T, inf);
- }
- printf("%d\n", ans - Dinic());
- return ;
- }
- #undef in
- #undef out
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] 蜥蜴 - 网络流
在一个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列的网格地图中有一些高度不同的石柱,一些石柱上 ...
随机推荐
- Strategy策略模式
策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...
- 从xubuntu-->windows xp
捣鼓了两个月的ubuntu之后我又乖乖的回到了windows的怀抱,不是抛弃linux而是要适应身边的环境. 身边的板子的驱动基本上都是xp的老一点的还是vista的,让人情何以堪. 我努力克服了,用 ...
- T-SQL JOIN
a表name sex张三 男李四 女 b表name age李四 30王五 23 1 全外连接select a.name,a.sex,b.name,b.agefrom a full outer join ...
- 数据结构B树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
- iOS - UISegmentedControl
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UISegmentedControl : UIControl <NSCoding> @available ...
- http1.1和http1.0区别
http1.1和服务器建立连接可以获得多个资源 http1.0和服务器建立连接可以获取一个值
- UI设计基础百科
摘自:http://www.csdn.net/article/2013-09-10/2816892-iOS-dev-tools-design 我的原型设计流程 这是一份UX原型设计流程,用来探索交互设 ...
- CSocket必须使用stream socket不能够使用数据报 socket
如果使用MFC socket类CSoket通讯,必须使用stream socket,不能够使用 SOCK_DGRAM 类型socket.原因如下: 1 stream socket和数据报socket的 ...
- UnicodeEncodeError
UnicodeEncodeError at /admin/shop/product/add/ 'ascii' codec can't encode characters in position 0-1 ...