题目链接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1066

题目大意:

在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。求无法逃离的蜥蜴总数的最小值。

思路:

网络流拆点建图。

对于每个石柱进行拆成两个点,然后在这两个点中限制最大流为石柱高度,这样保证经过石柱的次数,对于两个可以互相到达的点从一个点的出点往另一个入点连边,容量为INF,对于可以跳出界的点往汇点连边,对于有蜥蜴的点从源点向其连边。

  1 #include<bits/stdc++.h>
  2 #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
  3 #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
  4 #define Min(a, b) ((a) < (b) ? (a) : (b))
  5 #define Mem(a) memset(a, 0, sizeof(a))
  6 #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
  7 #define MID(l, r) ((l) + ((r) - (l)) / 2)
  8 #define lson ((o)<<1)
  9 #define rson ((o)<<1|1)
 10 #define Accepted 0
 11 #pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
 12 using namespace std;
 13 inline int read()
 14 {
 15     int x=0,f=1;char ch=getchar();
 16     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
 17     while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 18     return x*f;
 19 }
 20 typedef long long ll;
 21 const int maxn = 1000 + 10;
 22 const int MOD = 1000000007;//const引用更快,宏定义也更快
 23 const int INF = 1e9 + 7;
 24 const double eps = 1e-6;
 25 struct edge
 26 {
 27     int u, v, c, f;
 28     edge(int u, int v, int c, int f):u(u), v(v), c(c), f(f){}
 29 };
 30 vector<edge>e;
 31 vector<int>G[maxn];
 32 int level[maxn];//BFS分层,表示每个点的层数
 33 int iter[maxn];//当前弧优化
 34 int m;
 35 void init(int n)
 36 {
 37     for(int i = 0; i <= n; i++)G[i].clear();
 38     e.clear();
 39 }
 40 void addedge(int u, int v, int c)
 41 {
 42     //cout<<u<<" "<<v<<" "<<c<<endl;
 43     e.push_back(edge(u, v, c, 0));
 44     e.push_back(edge(v, u, 0, 0));
 45     m = e.size();
 46     G[u].push_back(m - 2);
 47     G[v].push_back(m - 1);
 48 }
 49 void BFS(int s)//预处理出level数组
 50 //直接BFS到每个点
 51 {
 52     memset(level, -1, sizeof(level));
 53     queue<int>q;
 54     level[s] = 0;
 55     q.push(s);
 56     while(!q.empty())
 57     {
 58         int u = q.front();
 59         q.pop();
 60         for(int v = 0; v < G[u].size(); v++)
 61         {
 62             edge& now = e[G[u][v]];
 63             if(now.c > now.f && level[now.v] < 0)
 64             {
 65                 level[now.v] = level[u] + 1;
 66                 q.push(now.v);
 67             }
 68         }
 69     }
 70 }
 71 int dfs(int u, int t, int f)//DFS寻找增广路
 72 {
 73     if(u == t)return f;//已经到达源点,返回流量f
 74     for(int &v = iter[u]; v < G[u].size(); v++)
 75         //这里用iter数组表示每个点目前的弧,这是为了防止在一次寻找增广路的时候,对一些边多次遍历
 76         //在每次找增广路的时候,数组要清空
 77     {
 78         edge &now = e[G[u][v]];
 79         if(now.c - now.f > 0 && level[u] < level[now.v])
 80             //now.c - now.f > 0表示这条路还未满
 81             //level[u] < level[now.v]表示这条路是最短路,一定到达下一层,这就是Dinic算法的思想
 82         {
 83             int d = dfs(now.v, t, min(f, now.c - now.f));
 84             if(d > 0)
 85             {
 86                 now.f += d;//正向边流量加d
 87                 e[G[u][v] ^ 1].f -= d;
 88     //反向边减d,此处在存储边的时候两条反向边可以通过^操作直接找到
 89                 return d;
 90             }
 91         }
 92     }
 93     return 0;
 94 }
 95 int Maxflow(int s, int t)
 96 {
 97     int flow = 0;
 98     for(;;)
 99     {
100         BFS(s);
101         if(level[t] < 0)return flow;//残余网络中到达不了t,增广路不存在
102         memset(iter, 0, sizeof(iter));//清空当前弧数组
103         int f;//记录增广路的可增加的流量
104         while((f = dfs(s, t, INF)) > 0)
105         {
106             flow += f;
107         }
108     }
109     return flow;
110 }
111 struct node
112 {
113     int x, y;
114     node(){}
115     node(int x, int y):x(x), y(y){}
116     bool operator < (const node& a)const
117     {
118         return x < a.x || x == a.x && y < a.y;
119     }
120 };
121 map<node, int>ID;
122 char Map[30][30];
123 int main()
124 {
125     int n, m, d;
126     scanf("%d%d%d", &n, &m, &d);
127     int tot = 0;
128     for(int i = 0; i < n; i++)
129     {
130         scanf("%s", Map[i]);
131         for(int j = 0; j < m; j++)
132         {
133             if(Map[i][j] != '0')
134             {
135                 ID[node(i, j)] = ++tot;
136                 addedge(tot, tot + 500, Map[i][j] - '0');
137                 if(i < d || j < d || n - i <= d || m - j <= d)
138                     addedge(tot + 500, 0, INF);
139             }
140         }
141     }
142     for(int i = 0; i < n; i++)
143     {
144         for(int j = 0; j < m; j++)
145         {
146             if(Map[i][j] != '0')
147             for(int x = -d; x <= d; x++)
148             {
149                 for(int y = -d; y <= d; y++)
150                 {
151                     int xx = x + i;
152                     int yy = y + j;
153                     if(xx >= 0 && xx < n && yy >= 0 && yy < m && (xx != i || yy != j) && Map[xx][yy] != '0')
154                     {
155                         if(abs(i - xx) + abs(j - yy) <= d)addedge(ID[node(i, j)] + 500, ID[node(xx, yy)], INF);
156                     }
157                 }
158             }
159         }
160     }
161     int cnt = 0;
162     for(int i = 0; i < n; i++)
163     {
164         scanf("%s", Map[i]);
165         for(int j = 0; j < m; j++)if(Map[i][j] == 'L')
166         {
167             addedge(1000, ID[node(i, j)], 1);
168             cnt++;
169         }
170     }
171     cout<<cnt-Maxflow(1000, 0)<<endl;
172     return Accepted;
173 }

转载于:https://www.cnblogs.com/fzl194/p/9693724.html

BZOJ 1066 蜥蜴 最大流相关推荐

  1. bzoj 1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4116  Solved: 2081 [Submit][Statu ...

  2. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec   Memory Limit: 162 MB Submit: 2947   Solved: 1471 [ Submit][ S ...

  3. BZOJ 1066[SCOI2007]蜥蜴

    学了ISAP说我来做一道网络流的傻逼题吧然后自己变成了一个傻逼.. De了很久的bug然后发现我从源点向每只蜥蜴连了INF的边,喵喵喵? 最近写博客好像比较敷衍,还是说一下.每个柱子拆点,源点向每个有 ...

  4. [SCOI2007] 蜥蜴 (最大流)

    [SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...

  5. 洛谷 - P2472 [SCOI2007]蜥蜴(最大流)

    题目链接:点击查看 题目大意:给出一个 n * m 的迷宫,每个位置都有一个耐久度,也就是至多经过 a[ i ][ j ] 位置 ( i , j ),现在迷宫中有一些蜥蜴,每一时刻在每一个位置至多有一 ...

  6. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

  7. c语言全局变量和局部变量作用域重合时,c语言全局变量与局部变量(当变量重名时)的使用情况...

    ABP框架 - 时间 文档目录 本节内容: 简介 时钟 客户端 时区 客户端 绑定器与转换器 简介 虽然有些应用目标市场只是在一个时区,有些应用目标市场是许多不同时区,为满足这种需求并集中化日期操作, ...

  8. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  9. 1066. [SCOI2007]蜥蜴【最大流】

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃 到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...

  10. BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)

    题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...

最新文章

  1. python里面temp是啥-Python tempfile模块学习笔记(临时文件)
  2. 各省市数据中心机房工程新建项目汇总(2021年)
  3. django jquery ajax 知识点
  4. AndroidStudio导入新项目一直卡在Building gradle project
  5. 如何在SSIS的脚本组件中访问变量
  6. “约见”面试官系列之常见面试题之第八十八篇之什么是vue生命周期(建议收藏)
  7. 美国ESG基金发展概览【天风金工吴先兴团队】
  8. 爬虫笔记之实战(一):爬取猫眼电影排行
  9. 计算机处理系统比人工的优势,人工智能技术的优势及其在计算机网络中的应用...
  10. 非银行支付机构网络支付业务管理办法
  11. java学习就去这56个网站论坛(附各种java学习公众号)
  12. (63)计数器设计(递增计数器)
  13. D - The Lucky Week ZOJ - 3939 (思维)
  14. 微信小程序--给头像添加logo(生成海报同理)
  15. 热门股权项目:富滇银行股份有限公司0.0232%股权转让
  16. 地理信息技术类毕业论文文献有哪些?
  17. PLC 200 Smart模拟量输入输出编程应用
  18. java构造方法是什么_java中什么叫构造方法,作用是什么?
  19. jira任务导出excel
  20. 网络对抗 Exp5 MSF基础应用 20154311 王卓然

热门文章

  1. Atitit 软件理论方面的书籍 目录 1. 计算机科学分为计算机理论和计算机应用。 计算机基础理论包含以下几部分: 2 1.1. ( 1) 程序理论( 程序逻辑、程序正确性验证、形式开发方法等
  2. Atitit 编程范式之道 attilax著 艾龙 著 1. 编程范式与编程语言的关系是什么? 1 2. LOP 面向语言编程(LOP, Language Oriented Programming
  3. Atitit.软件中见算法 程序设计五大种类算法
  4. Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结
  5. paip.函数式编程方法概述以及总结
  6. 2018年度中国LC3盛大召开!
  7. 毕设题目:Matlab优化分类
  8. 【图像分割】基于matlab人工鱼群算法图像分割【含Matlab源码 1488期】
  9. 【优化预测】基于matlab萤火虫算法优化BP神经网络预测【含Matlab源码 1313期】
  10. 【月径流预测】基于matlab海洋捕食者算法优化BP神经网络月径流预测【含Matlab源码 2002期】