传送门

思路:

  不少题解都是用网络流来做最小割(网络流是什么),但对于一个不会网络流的蒟蒻来做这题相当困难。

  听机房daolao说可以重构图做最短路。然后就baidu将平面图转换成一个对偶图,因为网络流的最小割 = 对偶图的最短路,所以只要在对偶图上跑最短路(从左上角跑到右下角)就行了。

  由于堆优化的Dijkstra写炸了,冒着“死亡”的风险码了个Spfa的最短路,开了O2竟然卡进800ms。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<deque>
#include<set>
using namespace std;
#define maxn 2000005
#define INF 0x3f3f3f3f
int cnt,n,m,w;
int head[maxn],vis[maxn],dis[maxn];
queue <int> q;
struct hh
{
int to,nex,dis;
}t[maxn<<];
inline int read()
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=(xs<<)+(xs<<)+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
inline void clear()//初始化
{
cnt=;
memset(vis,false,sizeof(vis));
memset(dis,INF,sizeof(dis));
memset(head,-,sizeof(head));
}
inline void add(int nex,int to,int dis)//前向星建图
{
t[cnt]=hh{to,head[nex],dis};
head[nex]=cnt++;
t[cnt]=hh{nex,head[to],dis};
head[to]=cnt++;
}
inline void getmap()//将平面图转换为对偶图
{
for(int j=;j<m;++j)//给每块标号
{
w=read();
add(,j*,w);
}
for(int i=;i<n;++i)
{
for(int j=;j<m;++j)
{
w=read();
add(*(i-)*(m-)+j*-,*(i-)*(m-)+j*,w);
}
}
if(n>=)
for(int j=;j<m;++j)
{
w=read();
add(*(n-)*(m-)+j*-,*(n-)*(m-)+,w);
}
for(int i=;i<n;++i)
{
for(int j=;j<=m;++j)
{
w=read();
if(j==) add(*(n-)*(m-)+,*(i-)*(m-)+,w);
else if(j==m) add(*i*(m-),,w);
else add(*(i-)*(m-)+(j-)*,*(i-)*(m-)+(j-)*+,w);
}
}
for(int i=;i<n;++i)
{
for(int j=;j<m;++j)
{
w=read();
add(*(i-)*(m-)+(j-)*+,*(i-)*(m-)+j*,w);
}
}
}
int main()
{
clear();
n=read();m=read();
if(n== || m==)
{
if(n>m) swap(n,m);
int ans=INF;
for(int i=;i<m;++i)
{
w=read();
ans=min(ans,w);
}
if(ans==INF) ans=;//特判只有全图只有一个点的情况
printf("%d\n",ans);
return ;
}
getmap();
dis[]=;vis[]=;//编号为 0 的点为起始点(左上角)
q.push();
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=;
for (int i=head[u];i!= -;i=t[i].nex)
{
int v=t[i].to,w=t[i].dis;
if (dis[v]>dis[u]+w)
{
dis[v] = dis[u] + w;
if (!vis[v])
{
vis[v] = ;
q.push(v);
}
}
}
}
printf("%d\n",dis[*(m-)*(n-)+]);//(2*(m-1)*(n-1)+1)号点为终点(右下角)
return ;
}

后记:

  因为蒟蒻水平有限,AC这题借鉴了两位大佬的bolg:

  ①LittleRewriter(洛谷题解)

  ②kafuuchino (机房的CRK大佬)

P4001 [BJOI2006]狼抓兔子的更多相关文章

  1. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  2. [洛谷P4001][BJOI2006]狼抓兔子

    题目大意:给你一个n*m的网格图,有三种边,横的,纵的和斜的,要你求出它的最小割 题解:网络流 卡点:1.无向图,反向弧容量应和正向弧相同 C++ Code: #include<cstdio&g ...

  3. 洛谷P4001 [BJOI2006]狼抓兔子(平面图转对偶图)

    传送门 明明只要最小割加点优化就能过的东西…… 然而我偏偏要去学平面图转对偶图结果发现课件关键地方看不清->这里 而且建图累的半死…… 说实话只要最大流建图的时候反向边直接设为当前边容量再加个当 ...

  4. BJOI2006狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 9967  Solved: 2267[Submit][S ...

  5. 752. [BJOI2006] 狼抓兔子

    ★★★   输入文件:bjrabbit.in   输出文件:bjrabbit.out   简单对比时间限制:1 s   内存限制:162 MB Description   Source: Beijin ...

  6. [BJOI2006]狼抓兔子

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

  7. 1001. [BJOI2006]狼抓兔子【最小割】

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

  8. BZOJ1001 BJOI2006 狼抓兔子

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

  9. [BJOI2006]狼抓兔子(网络流)

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

随机推荐

  1. Codeforce 513A - Game

    Two players play a simple game. Each player is provided with a box with balls. First player's box co ...

  2. SQL数据库增量备份还原方式

    SQLSERVER2008的备份还原最基本的方式自然是完整备份,然后完整还原即可. 但是如果遇到数据库文件很大,数据量很大,备份和还原需要花费不少时间的时候, 数据库的差异备份自然就成为考虑的备份方案 ...

  3. Autel MaxiSys Pro MS908P Software Update Gudie

    This article aims to guide on how to update software for Autel MaxiSys Pro. (Suitable for MaxiDiag E ...

  4. 面试必问之JVM篇

    前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...

  5. Spring Boot REST API 自动化测试

    Spring Boot需要写大量的Junit代码来测试REST API, 这点让不了解代码的人很头疼.如果使用REST client工具测试REST API,很多REST Client工具是不支持自动 ...

  6. win10系统jdk安装和环境变量配置

    新换电脑的原因,要重新安装jdk,完整记录一下安装过程 jdk版本用的1.7(公司默认版本) 这是jdk安装目录   更改为D:\jdk\java\jdk1.7 安装jre目录  更改为D:\jdk\ ...

  7. url去重 --布隆过滤器 bloom filter原理及python实现

    https://blog.csdn.net/a1368783069/article/details/52137417 # -*- encoding: utf-8 -*- ""&qu ...

  8. JavaScript document open() 方法:打开一个新文档

    <html> <head> <script type="text/javascript"> function createNewDoc() { ...

  9. Golang实现二分查找法

    二分查找法就是实现在一组有序的数字数组集合中最快找到指定元素的下标 思路 ①先找到中间的下标middle = (leftIndex + RightIndex) /2 ,然后让中间的下标值和FindVa ...

  10. JAVA中拆箱和装箱

    浅谈JAVA中拆箱与装箱 一.  什么是装箱?什么是拆箱? 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10) ...