bzoj 1001狼抓兔子(对偶图+最短路)最大流
题目
- 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,
- 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:
- 左上角点为(,),右下角点为(N,M)(上图中N=,M=).有以下三种类型的道路
- :(x,y)<==>(x+,y)
- :(x,y)<==>(x,y+)
- :(x,y)<==>(x+,y+)
- 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,
- 开始时所有的兔子都聚集在左上角(,)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击
- 这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,
- 才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的
- 狼的数量要最小。因为狼还要去找喜羊羊麻烦.
- Input
- 第一行为N,M.表示网格的大小,N,M均小于等于1000.
- 接下来分三部分
- 第一部分共N行,每行M-1个数,表示横向道路的权值.
- 第二部分共N-1行,每行M个数,表示纵向道路的权值.
- 第三部分共N-1行,每行M-1个数,表示斜向道路的权值.
- 输入文件保证不超过10M
- Output
- 输出一个整数,表示参与伏击的狼的最小数量.
- Sample Input
- Sample Output
题目图片
讲这部分之前,请先阅读以上的文章(讲得十分好%%%)(当然阅读到27页就好了)
读完后,我们发现这道题完全可以用其对偶图来跑最短路。
原图 对偶图
面数 x 面数 y
点数 y 那么其对偶图中 点数 x
边数 z 边数 z
面数和点数正好相反。
将原图的起点和终点连接起来,建立一个新的面(这是必须的)。
当然s点和t点之间是没有边的。
s和1,7,9,11之间有边。
t和2,4,6,12之间有边。
上面是我们建好的对偶图,从左至右依次编号,关于对偶图中面的编号,因为我们是按照横边,纵边,斜边的顺序读入的,所以我们一定要按照一定的方法对这些图编号
我采用的是从左至右依次编号,因为我们可以很清楚当前边连接的两个点(原图中的两个面)所在的位置,因为这是平面图,所以可以用欧拉公式来求出之前有多少点(
原图中的面)。再加上这个点(原图中的面(重要的事说三遍))在当前行中的位置就是它的编号。
只要原图中的两个面之间存在边,那么它的对偶图中的两个点就存在边。
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- int cnt, i, j, x, xx, xxx, h, t, s, hh[], n, m, w;
- bool dd[];
- int e, l[], d[], hhh, ww;
- struct node
- {
- int v, next, z;
- } b[];
- inline void add(int aa, int bb, int cc)//邻接表,建双向边
- {
- b[++cnt].v = bb;
- b[cnt].next = hh[aa];
- b[cnt].z = cc;
- hh[aa] = cnt;
- b[++cnt].v = aa;
- b[cnt].next = hh[bb];
- b[cnt].z = cc;
- hh[bb] = cnt;
- }
- void add1()
- {
- for(i = ; i < m; ++i)
- {
- scanf("%d", &x);
- add(i * , t, x);
- }
- for(i = ; i < n; ++i)
- {
- for(j = ; j < m; ++j)
- {
- scanf("%d", &x);
- add((i - ) * (m - ) * + j * , (i - ) * (m - ) * + j * - m * + , x);//利用欧拉公式确定编号并建边(下面的add函数也是如此)
- }
- }
- for(j = ; j < m; ++j)
- {
- scanf("%d", &x);
- add(s, (n - ) * * (m - ) + j * - , x);
- }
- }
- void add2()
- {
- for(i = ; i < n; ++i)
- {
- scanf("%d", &x);
- xx = (i - ) * (m - ) * + ;
- add(s, xx, x);
- for(j = ; j < m; ++j)
- {
- scanf("%d", &x);
- xx += ;
- add(xx - , xx, x);
- }
- scanf("%d", &x);
- add(xx + , t, x);
- }
- }
- inline void add3()
- {
- for(i = ; i < n; ++i)
- {
- for(j = ; j < m; ++j)
- {
- scanf("%d", &x);
- add((i - ) * (m - ) * + j * , (i - ) * (m - ) * + j * - , x);
- }
- }
- }
//下面的spfa中一定要用循环队列,省空间。不用的话空间开小(这很有可能毕竟1百万个点)可能会被卡。- void spfa()
- {
- dd[s] = true;
- h = ;
- w = ;
- memset(l,0x3f,sizeof(l));//将l数组赋成最大值
//hhh记录的是我们用的是队列中第几个元素(实际上)
//ww记录的是队列中总共有几个元素- l[s] = ;
- while()
- {
- if(hhh > ww)break;
- h = hhh % ;
- w = ww % ;
- for(i = hh[s]; i; i = b[i].next)
- {
- e = b[i].v;
- if(l[s] + b[i].z < l[e])
- {
- l[e] = l[s] + b[i].z;
- if(!dd[e])w = ww % , d[++w] = e, ww++, dd[e] = true;
- }
- }
- dd[s] = false;
- h = hhh % ;
- s = d[++h];
- hhh++;
- }
- }
- int main()
- {
- scanf("%d %d", &n, &m);
- if(n == m && n == )//特判
- {
- printf("");
- return ;
- }
- s = ;
- t = * (n - ) * (m - ) + ;
- add1();//读入横边
- add2();//读入纵边
- add3();//读入斜边
- spfa();//对其对偶图求s————t的最短路
- printf("%d", l[t]);
- return ;
- }
bzoj 1001狼抓兔子(对偶图+最短路)最大流的更多相关文章
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 29035 Solved: 7604 Descript ...
- 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路
[BZOJ1001][BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子 ...
- BZOJ 1001 - 狼抓兔子 - [Dinic最大流][对偶图最短路]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description现在小朋友们最喜欢的"喜羊羊与灰太狼", ...
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- BZOJ 1001 狼抓兔子 平面图的最小割
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1001 题目大意: 见链接 思路: 求最小割,平面图的最小割等价于对偶图的最短路 直接建 ...
- BZOJ 1001 狼抓兔子
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子 ...
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
随机推荐
- windows命令——explorer
转至http://www.cnblogs.com/ymind/archive/2012/03/30/explorer-command-args.html 今天才知道,explorer原来可以这样用, ...
- window系统JDK1.7的快速配置
快速配置java环境变量 右键单击计算机--->属性 点击 "高级系统设置"--->"环境变量",出现环境变量设置窗口 系统变量--->新建 ...
- Text文档编码识别方法
Text文档编码识别方法 在做文档读取的时候,时常碰到编码格式不正确的问题,而要怎么样正确识别文档的编码格式,成了很多程序员的一块心病,今天我就要试着治好这块心病,这段代码的浓缩来自上千万文档的数据分 ...
- 剖析twemproxy前言
又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...
- KnockoutJS 3.X API 第六章 组件(4) 自定义元素
自定义元素提供了一种将组件注入视图的方便方法. 本节目录 介绍 例子 传递参数 父组件和子组件之间的通信 传递监控属性的表达式 将标记传递到组件中 控制自定义元素标记名称 注册自定义元素 备注1:将自 ...
- MongoDB 搭建副本集
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...
- MongoDB 安装和可视化工具
MongoDB 是一款非常热门的NoSQL,面向文档的数据库管理系统,官方下载地址是:MongoDB,博主选择的是 Enterprise Server (MongoDB 3.2.9)版本,安装在Win ...
- Data Flow的Error Output
一,在Data Flow Task中,对于Error Row的处理通过Error Output Tab配置的. 1,操作失败的类型:Error(Conversion) 和 Truncation. 2, ...
- 解读sencha touch移动框架的核心架构(一)
sencha的前身就是Extjs了,sencha 框架是世界上第一个基于HTML5的Mobile App框架 那么何谓框架,传统软件工程对于库和框架的区分主要着眼于对应用运行流程的控制权,框架提供架构 ...
- 探讨Android中的内置浏览器和Chrome
1.Android默认浏览器和Chrome的区别 Android出厂自带的浏览器:安卓WebKit浏览器,也成内置浏览器或者默认浏览器. 安卓WebKit不是Chrome.Chrome浏览器在它的用户 ...