传送门

思路:

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

  听机房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. How to do if the GM MDI cant connect with the software

    When you use GM MDI on your laptop , you may meet some troubles . Such as it cant communicate with t ...

  2. MyEclipse如何配置Struts2源码的框架压缩包

    1.MyEclipse如何配置Struts2源码的框架压缩包 如本机的Struts2框架压缩包路径为:D:\MyEclipseUserLibraries\struts\struts-2.3.15.3- ...

  3. HashMap的实现原理总结

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象. 当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到b ...

  4. android studio下载地址

    AndroidStudio3.0 下载地址——高速下载 https://www.androiddevtools.cn/   2017年08月20日 22:41:09 qq风轻云淡 阅读数:5559   ...

  5. socket - option编程:SO_REUSEADDR

    网友vmstat多次提出了这个问题:SO_REUSEADDR有什么用处和怎么使用.而且很多网友在编写网络程序时也会遇到这个问题.所以特意写了这么一篇文章,希望能够解答一些人的疑难. 其实这个问题在Ri ...

  6. SaaS公司融资的「22条军规 」(转)

    编者按:本文是SaaS教父Jason Lemkin的一篇分享.他在文章中分享了他不投资一家公司的22条理由,希望对打算融资和正在融资的你有所启发. 为何有的早期创业公司能成功融资,而有的公司融资却屡遭 ...

  7. SSL/TLS代理(termination proxy)

    A TLS termination proxy (or SSL termination proxy) is a proxy server that is used by an institution ...

  8. ZVAL——PHP源码分析

    基于 PHP 5.6.20 ZVAL——php变量实现的基础 _zval_struct 结构体的定义位于 Zend/zend.h 322 行 typedef union _zvalue_value { ...

  9. FileZilla连接腾讯云Centos7

    现在需要使用ftp快速上传资料去云机备份, 于是想到FileZilla. 生成密匙文件 登录腾讯云--ssh密匙 FileZilla Client 导入密匙文件 填写登录信息 连接 另外记得开放22端 ...

  10. 神经网络优化算法如何选择Adam,SGD

    之前在tensorflow上和caffe上都折腾过CNN用来做视频处理,在学习tensorflow例子的时候代码里面给的优化方案默认很多情况下都是直接用的AdamOptimizer优化算法,如下: o ...