传送门

思路:

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

  听机房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. python 闭包和装饰器

    python 闭包和装饰器 一.闭包闭包:外部函数FunOut()里面包含一个内部函数FunIn(),并且外部函数返回内部函数的对象FunIn,内部函数存在对外部函数的变量的引用.那么这个内部函数Fu ...

  2. 自学java第六周的总结

    在这个星期里,我主要将以前看过的复习了一遍,并且阅读并做了相关的题. 下个星期继续努力.

  3. 一起学习在 Ubuntu 上授予和移除 sudo 权限

    如你所知,用户可以在 Ubuntu 系统上使用 sudo 权限执行任何管理任务.在 Linux 机器上创建新用户时,他们无法执行任何管理任务,直到你将其加入 sudo 组的成员.在这个简短的教程中,我 ...

  4. 关于reduce输出write方法

    关于hadoop一些自定义输出 code>OutputFormat</code> describes the output-specification for a * Map-Red ...

  5. Maven笔记 #01# 入门

    索引 Maven是干什么的? 用Maven的好处 Maven与命令行 Maven与IntelliJ IDEA 一.Maven是干什么的? 我相信只要你写过足够多的代码,就... 肯定有思考过写一个脚本 ...

  6. VIM编码检查

    trouble shooting https://www.django.cn/article/show-4.html https://blog.csdn.net/lh756437907/article ...

  7. mysql union 和 left join 结合查询用法

    union 和 left join 结合查询用法 SELECT u.nickname,z.group_comming_type,z.id,z.user_id,z.title,z.create_time ...

  8. Jira客户端

    github地址 https://github.com/rcarz/jira-client 使用 1)私服 <!-- https://mvnrepository.com/artifact/net ...

  9. bzoj4861 / P3715 [BJOI2017]魔法咒语

    P3715 [BJOI2017]魔法咒语 AC自动机+dp+矩阵乘法 常规思路是按基本串建立AC自动机 然鹅这题是按禁忌串建立AC自动机 对后缀是禁忌的点以及它的失配点做上标记$(a[i].ed)$, ...

  10. 关于er模型中的identifying relationship or non-identifying relationship

    最近,主要负责项目管理和领域模型设计方面的工作,昨天在将UML类图转换为ER模型的时候,发现有identifying relationship or non-identifying relations ...