推荐文章:浅析最大最小定理在信息学竞赛中的应用》--周冬

题目

现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,
而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(,),右下角点为(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狼抓兔子(对偶图+最短路)最大流的更多相关文章

  1. BZOJ 1001 狼抓兔子 (最小割转化成最短路)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 27715  Solved: 7134[Submit][ ...

  2. BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 29035  Solved: 7604 Descript ...

  3. 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路

    [BZOJ1001][BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子 ...

  4. BZOJ 1001 - 狼抓兔子 - [Dinic最大流][对偶图最短路]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description现在小朋友们最喜欢的"喜羊羊与灰太狼", ...

  5. BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...

  6. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  7. BZOJ 1001 狼抓兔子 平面图的最小割

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1001 题目大意: 见链接 思路: 求最小割,平面图的最小割等价于对偶图的最短路 直接建 ...

  8. BZOJ 1001 狼抓兔子

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子 ...

  9. bzoj1001狼抓兔子 对偶图优化

    bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...

随机推荐

  1. Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)

    <Windows Azure Platform 系列文章目录> 前提要求: 1.假设笔者捕获一个Azure虚拟机模板,命名为leistorage 关于Azure虚拟机模板,请参考下图: 2 ...

  2. jieba中文分词的.NET版本:jieba.NET

    简介 平时经常用Python写些小程序.在做文本分析相关的事情时免不了进行中文分词,于是就遇到了用Python实现的结巴中文分词.jieba使用起来非常简单,同时分词的结果也令人印象深刻,有兴趣的可以 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  4. Socket programing(make a chat software) summary 1:How to accsess LAN from WAN

    First we should know some basic conceptions about network: 1.Every PC is supposed to have its own IP ...

  5. 升级CentOS内核 - 2.6升级到3.10

    *因为学习docker的需要,docker的官方推荐内核使用3.8以上,所以本人决定把CentOS内核升到长期稳定版的3.10. ##记得切换到root用户执行升级操作. [root@localhos ...

  6. Spark的持久化简记

    摘要: 1.spark 提供的持久化方法 2.Spark的持久化级别 3.如何选择一种最合适的持久化策略 内容: 1.spark 提供的持久化方法 如果要对一个RDD进行持久化,只要对这个RDD调用c ...

  7. JDK下载、安装、配置环境变量笔记

    自己总是在下载.安装.配置JDK的环境变量,但是这些需要的专业知识并不难,但有很多细节很重要,总是记不住,而且这些细节一旦出错影响还是很严重的,在网上查到的信息很多都比较零散,而且讲解得也不是很详细, ...

  8. 史上最全的 Redux 源码分析

    前言 用 React + Redux 已经一段时间了,记得刚开始用Redux 的时候感觉非常绕,总搞不起里面的关系,如果大家用一段时间Redux又看了它的源码话,对你的理解会有很大的帮助.看完后,在回 ...

  9. 有关binlog的那点事(mysql5.7.13)

    binlog作为mysql中最重要的日志之一,能实现异常恢复以及主从复制. 我们主要讨论的是主从复制中的binlog,这里将以mysql5.7.13的源码为主要依据来分析binlog. 在主从复制中, ...

  10. iOS-Runtime在开发中的使用及相关面试题

    OC语言中最为强大的莫过于OC的运行时机制-Runtime,但因其比较接近底层,一旦使用Runtime出现bug,将很难调试,所以Runtime在开发中能不用就不用.下面我将介绍一些Runtime在开 ...