[SCOI2007]蜥蜴 BZOJ1066 最大流
题目背景
07四川省选
题目描述
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。
每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。
输入输出格式
输入格式:
输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石柱的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
输出格式:
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
输入输出样例
- 1
说明
100%的数据满足:1<=r, c<=20, 1<=d<=4
首先将每一个石块拆为两个点,容量为其高度;
设源点和汇点,
st 和每一个蜥蜴的位置连容量为1的边,
如果可以跳出自然与ed连inf 的边;
如果在给定的dis范围内,每个点的出与另一个点的入连inf的边;
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstdlib>
- #include<cstring>
- #include<string>
- #include<cmath>
- #include<map>
- #include<set>
- #include<vector>
- #include<queue>
- #include<bitset>
- #include<ctime>
- #include<deque>
- #include<stack>
- #include<functional>
- #include<sstream>
- //#include<cctype>
- //#pragma GCC optimize(2)
- using namespace std;
- #define maxn 200005
- #define inf 0x3f3f3f3f
- //#define INF 1e18
- #define rdint(x) scanf("%d",&x)
- #define rdllt(x) scanf("%lld",&x)
- #define rdult(x) scanf("%lu",&x)
- #define rdlf(x) scanf("%lf",&x)
- #define rdstr(x) scanf("%s",x)
- typedef long long ll;
- typedef unsigned long long ull;
- typedef unsigned int U;
- #define ms(x) memset((x),0,sizeof(x))
- const long long int mod = 1e9 + 7;
- #define Mod 1000000000
- #define sq(x) (x)*(x)
- #define eps 1e-3
- typedef pair<int, int> pii;
- #define pi acos(-1.0)
- const int N = 1005;
- #define REP(i,n) for(int i=0;i<(n);i++)
- typedef pair<int, int> pii;
- inline ll rd() {
- ll x = 0;
- char c = getchar();
- bool f = false;
- while (!isdigit(c)) {
- if (c == '-') f = true;
- c = getchar();
- }
- while (isdigit(c)) {
- x = (x << 1) + (x << 3) + (c ^ 48);
- c = getchar();
- }
- return f ? -x : x;
- }
- ll gcd(ll a, ll b) {
- return b == 0 ? a : gcd(b, a%b);
- }
- ll sqr(ll x) { return x * x; }
- /*ll ans;
- ll exgcd(ll a, ll b, ll &x, ll &y) {
- if (!b) {
- x = 1; y = 0; return a;
- }
- ans = exgcd(b, a%b, x, y);
- ll t = x; x = y; y = t - a / b * y;
- return ans;
- }
- */
- int n, m;
- int st, ed;
- struct node {
- int u, v, nxt, w;
- }edge[maxn<<1];
- int head[maxn], cnt;
- void addedge(int u, int v, int w) {
- edge[cnt].u = u; edge[cnt].v = v; edge[cnt].w = w;
- edge[cnt].nxt = head[u]; head[u] = cnt++;
- }
- int rk[maxn];
- int bfs() {
- queue<int>q;
- ms(rk); rk[st] = 1;
- q.push(st);
- while (!q.empty()) {
- int tmp = q.front(); q.pop();
- for (int i = head[tmp]; i != -1; i = edge[i].nxt) {
- int to = edge[i].v;
- if (rk[to] || edge[i].w <= 0)continue;
- rk[to] = rk[tmp] + 1; q.push(to);
- }
- }
- return rk[ed];
- }
- int dfs(int u, int flow) {
- if (u == ed)return flow;
- int add = 0;
- for (int i = head[u]; i != -1 && add < flow; i = edge[i].nxt) {
- int v = edge[i].v;
- if (rk[v] != rk[u] + 1 || !edge[i].w)continue;
- int tmpadd = dfs(v, min(edge[i].w, flow - add));
- if (!tmpadd) { rk[v] = -1; continue; }
- edge[i].w -= tmpadd; edge[i ^ 1].w += tmpadd; add += tmpadd;
- }
- return add;
- }
- int ans;
- void dinic() {
- while (bfs())ans += dfs(st, inf);
- }
- int mp[100][100];
- int hight[100][100];
- int x[maxn], y[maxn];
- int fg[1000][1000];
- double dis(int a, int b, int x, int y) {
- return (a - x)*(a - x) + (b - y)*(b - y);
- }
- double getid(int a, int b) {
- return (a - 1)*m + b;
- }
- int main()
- {
- //ios::sync_with_stdio(0);
- memset(head, -1, sizeof(head));
- rdint(n); rdint(m); int d; rdint(d);
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- char ch; cin >> ch;
- hight[i][j] = ch - '0';
- }
- }
- int tot = 0;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- char ch; cin >> ch;
- if (ch == 'L') {
- fg[i][j] = 1; tot++;// 总的蜥蜴数量
- }
- }
- }
- st = 2 * n*m + 1; ed = st + 1;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- int id = getid(i, j);
- if (hight[i][j]) {
- // 拆点,分为出、入
- addedge(id, id + n * m, hight[i][j]);
- addedge(id + n * m, id, 0);
- if (i + d > n || i - d<1 || j + d>m || j - d < 1) {
- // 跳出
- addedge(id + n * m, ed, inf);
- addedge(ed, id + n * m, 0);
- }
- if (fg[i][j]) {
- addedge(st, id, 1); addedge(id, st, 0);
- }
- }
- }
- }
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- for (int a = 1; a <= n; a++) {
- for (int b = 1; b <= m; b++) {
- if (dis(i, j, a, b) <= d * d) {
- int id1 = getid(i, j);
- int id2 = getid(a, b);
- addedge(id1 + n * m, id2, inf);
- addedge(id2, id1 + n * m, 0);
- addedge(id2 + n * m, id1, inf);
- addedge(id1, id2 + n * m, 0);
- }
- }
- }
- }
- }
- dinic();
- cout << tot - ans << endl;
- return 0;
- }
[SCOI2007]蜥蜴 BZOJ1066 最大流的更多相关文章
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
- bzoj1066: [SCOI2007]蜥蜴(最大流)
1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...
- P2472 [SCOI2007]蜥蜴(最大流)
P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...
- BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html
- 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...
- [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】
题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...
- BZOJ 1066:[SCOI2007]蜥蜴(最大流)
蜥蜴Description在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...
- BZOJ 1066 [SCOI2007]蜥蜴(最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...
随机推荐
- I/O完成端口(IOCP)
服务器: #include "stdafx.h" #include <winsock2.h> #pragma comment(lib, "ws2_32.lib ...
- 第六章 Java性能调优工具(待续)
Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...
- Tiny4412 u-boot分析(2)u-boot启动流程
从大方面来说,u-boot的启动分成两个阶段,第一个阶段主要的职责是准备初始化的环境,主要有以下几点 ①设置异常向量表 ②把CPU的工作模式设置为SVC32模式 ③关闭中断.MMU和cache ④关闭 ...
- Emulator PANIC: Could not open: AVD2.3.1
这是这两年的sdk才需要这样,以前这样根本没错的 在环境变量 里面增加一个系统变量ANDROID_SDK_HOME,值就是当前的系统用户文件夹的位置.比如c:\\Users\xxx(不要加.andro ...
- JavaScript中数值和对象
一.创建对象并将其初始化 a.使用new创建对象和方法 <<!DOCTYPE html> <html> <head> <mete http-equiv ...
- PHP的count(数组)和strlen(字符串)的内部实现
PHP的count(数组)和strlen(字符串)的内部实现上是直接显示一个长度变量,还是重头依次数一遍有多少个元素?关乎我理解这2个函数的效率..希望高人能从php的c源码上讲一讲.没有源码看过源码 ...
- C++面向对象类的实例题目三
编写一个程序,设计一个满足如下要求的CData类. (1)用下面的格式输出日期:日/月/年 (2)输出在当前日期上加一天后的日期 (3)设置日期 code: #include<iostream& ...
- Matlab 摄像机标定+畸变校正
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- Linux cpulimit命令
一.简介 http://www.3lian.com/edu/2015/06-12/221261.html 二.安装 http://toutiao.com/a6184908783490073090/ 三 ...
- 关于Java中hashCode方法的实现源码
首先来看一下String中hashCode方法的实现源码. public int hashCode() { int h = hash; if (h == 0 && value.leng ...