Description

  现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:

  左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.

Input

  第一行为N,M.表示网格的大小,N,M均小于等于1000.接下来分三部分第一部分共N行,每行M-1个数,表示横向道路的权值. 第二部分共N-1行,每行M个数,表示纵向道路的权值. 第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 输入文件保证不超过10M

Output

  输出一个整数,表示参与伏击的狼的最小数量.

Sample Input

3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6

Sample Output

14

HINT

  2015.4.16新加数据一组,可能会卡掉从前可以过的程序。

Solution

  乍一看是一道网络流的题,但是实际写完会发现超时超到姥姥家去了。

  定理:平面图的最大流=该图对偶图的最短路,某形象解释见某贴心神犇
  之后SPFA乱搞或Dijkstra乱搞,不过我建边的方式有点鬼畜。
 
 #include <cstdio>
#include <cstring>
using namespace std;
struct node
{
int v, w;
}edge[];
int fst[], nxt[], sss, ttt, dis[], q[], front, back;
bool inq[]; void qscanf(int &x)
{
char c = getchar();
x = ;
while(c < '' || c > '')
c = getchar();
while(c >= '' && c <= '')
x = x * + c - '', c = getchar();
} void addedge(int i, int u, int v, int w)
{
edge[i << ] = (node){v, w}, nxt[i << ] = fst[u], fst[u] = i << ;
edge[i << | ] = (node){u, w}, nxt[i << | ] = fst[v], fst[v] = i << | ;
} void SPFA()
{
memset(dis, , sizeof(dis));
dis[sss] = , inq[sss] = q[++back] = sss;
while(front != back)
{
int u = q[++front % ];
inq[u] = false, front %= ;
for(int i = fst[u]; i; i = nxt[i])
{
int v = edge[i].v, w = edge[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(!inq[v])
{
dis[v] = dis[u] + w;
inq[v] = true;
q[++back % ] = v;
back %= ;
}
}
}
}
} int main()
{
int n, m, etot = ;
qscanf(n), qscanf(m);
n--, m--;
if(n && m)
{
sss = n * m * + , ttt = n * m * + ;
for(int i = ; i <= n + ; i++)
for(int j = ; j <= m; j++)
{
int u = ((i - ) * m + j) * - , v = ((i - ) * m + j) * , w;
qscanf(w);
if(i == )
addedge(++etot, sss, v, w);
else if(i == n + )
addedge(++etot, u, ttt, w);
else
addedge(++etot, u, v, w);
}
for(int i = ; i <= n; i++)
for(int j = ; j <= m + ; j++)
{
int u = ((i - ) * m + j) * - , v = ((i - ) * m + j) * - , w;
qscanf(w);
if(j == )
addedge(++etot, ttt, v, w);
else if(j == m + )
addedge(++etot, u, sss, w);
else
addedge(++etot, u, v, w);
}
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
{
int u = ((i - ) * m + j) * - , v = ((i - ) * m + j) * , w;
qscanf(w), addedge(++etot, u, v, w);
}
SPFA();
}
else
{
if(m)
n = m;
dis[ttt] = ;
for(int i = ; i <= n; i++)
{
qscanf(fst[i]);
if(dis[ttt] > fst[i])
dis[ttt] = fst[i];
}
}
printf("%d\n", dis[ttt]);
return ;
}

[BZOJ1001] [Beijing2006] 狼抓兔子 (最短路)的更多相关文章

  1. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

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

  2. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

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

  3. BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)

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

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

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Se ...

  5. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

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

  6. BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

    平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...

  7. bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...

  8. bzoj1001: [BeiJing2006]狼抓兔子(初识是你最小割)

    1001: [BeiJing2006]狼抓兔子 题目:传送门 题解: 听说这题当初是大难题...可惜当年没有网络流hahahha 现在用网络流的思想就很容易解决了嘛 给什么连什么,注意是双向边,然后跑 ...

  9. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

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

随机推荐

  1. PLEC-交流电机系统+笔记

    1.固有机械特性近似图 2.三相交流电机的控制系统 1)理论推导 第一次制动选择能耗制动,第二次制动选择倒拉制动. 2)模型搭建 3)模拟仿真 3.心得体会和笔记总结 制动方式的选择主要是根据各个制动 ...

  2. Hive metastore表结构设计分析

    今天总结下,Hive metastore的结构设计.什么是metadata呢,对于它的描述,可以理解为数据的数据,主要是描述数据的属性的信息.它是用来支持如存储位置.历史数据.资源查找.文件记录等功能 ...

  3. Netty基础点滴

    编写一个应答服务器 编写一个应答服务器 写一个Netty服务器主要由两部分组成: 配置服务器功能,如线程.端口 实现服务器处理程序,它包含业务逻辑,决定当有一个请求连接或接收数据时该做什么 启动服务器 ...

  4. docker设置固定ip地址

    Docker安装后,默认会创建下面三种网络类型 $ docker network ls NETWORK ID NAME DRIVER SCOPE 9781b1f585ae bridge bridge ...

  5. angular2 localStorage的使用

    最近从ng1  转ng2     相信 使用ng1的同学都知道 ngStorage 这个插件吧,  存储 本地数据 下面介绍一下 ng2 使用 localStorage 参考 github https ...

  6. Java导出freemarker实现下载word文档格式功能

    首先呢,先说一下制作freemarker模板步骤, 1. 在WPS上写出所要的下载的word格式当做模板 2. 把模板内不固定的内容(例:从数据库读取的信息)写成123或者好代替的文字标注 3. 把固 ...

  7. Hibernate学习(四)get和Load比较

    package cn.lonecloud.test.crud; import org.hibernate.HibernateException; import org.hibernate.Sessio ...

  8. java网络编程(3)——UDP

    UDP在java中主要使用DatagramSocket来实现通讯,数据一般是通过DatagramPacket来封装: 发送方只需指定接受方的地址和端口,然后通过send()方法就可以把封装在Datag ...

  9. 基于Python的Flask的开发实战(第二节程序的基本结构)

    1.初始化 所有的flask程序都必须创建一个程序实例 web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理.这个程序实例就是flask对象 from flask imp ...

  10. Luogu P1747 好奇怪的游戏

    题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被 ...