bzoj 1066 : [SCOI2007]蜥蜴 网络流
给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度。 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, 如果高度变为0, 那么石柱消失, 无法在跳到这个位置上, 跳到的那个石柱高度不会发生改变, 同一时刻一个石柱无法站两个蜥蜴。问有多少蜥蜴无法跳出边界。
很裸的网络流, 如果一个石柱距离边界距离小于d, 那么向汇点连一条权值为inf的边, 如果一个石柱初始有蜥蜴, 那么源点向这个点连一条1的边, 每个点拆成两个点, u向u'连一条边, 权值为高度。 一个石柱向所有距离他曼哈顿距离小于d的石柱连边, 权值inf。 跑一遍网络流就可以...
- #include<bits/stdc++.h>
- using namespace std;
- #define pb(x) push_back(x)
- #define ll long long
- #define mk(x, y) make_pair(x, y)
- #define lson l, m, rt<<1
- #define mem(a) memset(a, 0, sizeof(a))
- #define rson m+1, r, rt<<1|1
- #define mem1(a) memset(a, -1, sizeof(a))
- #define mem2(a) memset(a, 0x3f, sizeof(a))
- #define rep(i, a, n) for(int i = a; i<n; i++)
- #define ull unsigned long long
- typedef pair<int, int> pll;
- const double PI = acos(-1.0);
- const double eps = 1e-;
- const int mod = 1e9+;
- const int inf = ;
- const int dir[][] = { {-, }, {, }, {, -}, {, } };
- int a[][];
- const int maxn = 2e5+;
- int q[maxn*], head[maxn*], dis[maxn/], s, t, num;
- struct node
- {
- int to, nextt, c;
- node(){}
- node(int to, int nextt, int c):to(to), nextt(nextt), c(c){}
- }e[maxn*];
- void init() {
- num = ;
- mem1(head);
- }
- void add(int u, int v, int c) {
- e[num] = node(v, head[u], c); head[u] = num++;
- e[num] = node(u, head[v], ); head[v] = num++;
- }
- int bfs() {
- mem(dis);
- dis[s] = ;
- int st = , ed = ;
- q[ed++] = s;
- while(st<ed) {
- int u = q[st++];
- for(int i = head[u]; ~i; i = e[i].nextt) {
- int v = e[i].to;
- if(!dis[v]&&e[i].c) {
- dis[v] = dis[u]+;
- if(v == t)
- return ;
- q[ed++] = v;
- }
- }
- }
- return ;
- }
- int dfs(int u, int limit) {
- if(u == t) {
- return limit;
- }
- int cost = ;
- for(int i = head[u]; ~i; i = e[i].nextt) {
- int v = e[i].to;
- if(e[i].c&&dis[v] == dis[u]+) {
- int tmp = dfs(v, min(limit-cost, e[i].c));
- if(tmp>) {
- e[i].c -= tmp;
- e[i^].c += tmp;
- cost += tmp;
- if(cost == limit)
- break;
- } else {
- dis[v] = -;
- }
- }
- }
- return cost;
- }
- int dinic() {
- int ans = ;
- while(bfs()) {
- ans += dfs(s, inf);
- }
- return ans;
- }
- int main()
- {
- int n, m, d;
- cin>>n>>m>>d;
- int mn = m*n, x;
- init();
- s = *mn, t = s+;
- char c[];
- for(int i = ; i<n; i++) {
- scanf("%s", c);
- for(int j = ; j<m; j++) {
- a[i][j] = c[j]-'';
- if(!a[i][j])
- continue;
- if(i<d||j<d||i+d>=n||j+d>=m) {
- add(i*m+j+mn, t, inf);
- }
- add(i*m+j, i*m+j+mn, a[i][j]);
- }
- }
- int ans = ;
- for(int i = ; i<n; i++) {
- scanf("%s", c);
- for(int j = ; j<m; j++) {
- if(c[j] == 'L') {
- add(s, i*m+j, );
- ans++;
- }
- }
- }
- for(int i = ; i<n; i++) {
- for(int j = ; j<m; j++) {
- if(!a[i][j])
- continue;
- for(int x = max(, i-d); x<=min(n-, i+d); x++) {
- for(int y = max(, j-d); y<=min(m-, j+d); y++) {
- if(x == i&& y==j )
- continue;
- if(!a[x][y])
- continue;
- if(abs(x-i)+abs(y-j)>d)
- continue;
- add(i*m+j+mn, x*m+y, inf);
- }
- }
- }
- }
- ans -= dinic();
- cout<<ans<<endl;
- return ;
- }
bzoj 1066 : [SCOI2007]蜥蜴 网络流的更多相关文章
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )
结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...
- [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】
题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...
- poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流
题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...
- BZOJ 1066 [SCOI2007]蜥蜴(最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...
- bzoj 1066: [SCOI2007] 蜥蜴
这道题还是挺好想的,但我一开始还是想错了…… 把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量.关于蜥蜴是否单独成点,我是单独当成了一个点 ...
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
- 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...
- 【BZOJ】1066: [SCOI2007]蜥蜴
[算法]网络流-最大流(dinic) [题解] 构图思路: 因为石柱高度是可以被消耗的,即一根石柱可通过的蜥蜴数量有限,取舍问题中这样表示容量的属性显然可以作为网络流中的边. 于是将一根石柱拆成顶部和 ...
随机推荐
- 获取xml文件
<?xml version="1.0" encoding="utf-8" ?><ArrayOfSystemRool xmlns:xsi=&qu ...
- Mac浏览器全屏设置
在 mac 升级之后,以往点击放大的按钮,现在显示的效果是全屏:
- DOM缘起
DOM是现在按W3C标准的浏览器均实现的标准.HTML.CSS.DOM共同在结构.表现.交互上共同支撑起一个页面.当然,必须以用户为中心.平稳退化.逐渐增强.DOM的操作是通过JS来实现的.JS最初在 ...
- jquery中validate插件表单验证
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- git彻底删除commit记录的方法
在github上,如果非默认分支的话,直接用以下方法: git reset --hard <commit_id> git push origin HEAD --force 如是默认分支,需 ...
- struts2笔记04-XxxAware接口
1.XxxAware接口 ApplicationAware, RequestAware,SessionAware, ParameterAware. struts2提供了这四个Aware接口用 ...
- codeforces 659F . Polycarp and Hay 搜索
题目链接 遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索. 将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列. 不断重复, 直到 ...
- JAVA并发,BlockingQuene
BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类1.ArrayBlo ...
- 使用百度语音识别REST API,做全平台语音识别
百度语音开发介绍文档: http://yuyin.baidu.com/docs/asr# 使用语音识别,需要在百度申请一个应用,然后拿到API Key和Secret Key,然后才可以使用语音识别 p ...
- IP地址获取到为0:0:0:0:0:0:0:1
引用 13 楼 oXiaoShe 的回复: Quote: 引用 11 楼 ahjsdzm 的回复: [Quote=引用 9 楼 huazaiyou 的回复:]最近在进行web开发时,遇到了reques ...