(胡扯时间)今天炒鸡无聊就打算BZOJ开始从第一道题开始顺着打,这样未来一段时间内也就有事干了。结果发现A+B切掉后就遭遇了一个"小小"的瓶颈(真不友好。

好了说题说题。看题第一眼我下意识想打个最短路直接跑过,结果发现没有给兔子总共有多少(那就肯定最短不了了。

然后内心***之后发现还不是平面图,那我赶紧先认真起来好好打(恶)个(补)对偶图吧。

此时我又想到了qy巨佬教育我们的"脑补一下这个题,是不是很简单。"

脑补越强,对偶图越简单。

正解time:

显而易见这是一道赤果果的网络流,那就转化为对偶图然后直接跑个堆优化Dij吧。

在我MLE两遍T了一次以后发现还是得用spfa(qwq。

个人感觉最难的其实还是在平面图->对偶图的时候需要脑补每个面的编号进行加边。

我当时一直不太理解两个面连边是穿过的曾经的那个边就为现在这个边的权值应该如何实现。

后来发现完全可以直接建对偶图而不是平面图->对偶图。(orz。

我的加边代码可能和你们的不太一样(编号问题,所以推荐自己脑补一下自己的代码。

死于快读。!!!!!!!

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<queue>
#define rg register
using namespace std;
//inline int read(){
// rg int s=0,f=0;
// rg char ch=getchar();
// while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
// while(isdigit(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
// return f?-s:s;
//}
int n,m,s,t,cnt;
const int MAX=6000015;
struct edge{
int nxt;
int to;
int val;
}e[MAX];
int dis[MAX],head[MAX];
bool vis[MAX];
queue<int>q;
inline void add(int u,int v,int w){
e[++cnt].nxt=head[u];
e[cnt].to=v;
e[cnt].val=w;
head[u]=cnt;
}
int spfa(){
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(rg int i=head[u];i;i=e[i].nxt){
if(dis[e[i].to]>dis[u]+e[i].val){
dis[e[i].to]=dis[u]+e[i].val;
if(!vis[e[i].to]){
vis[e[i].to]=1;
q.push(e[i].to);
}
}
}
}
return dis[t];
}
int main(){
// n=read(),m=read();
scanf("%d %d",&n,&m);
s=0,t=(n-1)*(m-1)*2+1;
for(rg int i=1;i<=m-1;++i){
// int w=read();
int w;
scanf("%d",&w);
add(i*2,t,w);
add(t,i*2,w);
}
for(rg int i=2;i<=n-1;++i){
for(rg int j=1;j<=m-1;++j){
// int w=read();
int w;
scanf("%d",&w);
add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2-m*2+1,w);
add((i-1)*(m-1)*2+j*2-m*2+1,(i-1)*(m-1)*2+j*2,w);
}
}
for(rg int i=1;i<=m-1;++i){
// int w=read();
int w;
scanf("%d",&w);
add((n-2)*2*(m-1)+i*2-1,s,w);
add(s,(n-2)*2*(m-1)+i*2-1,w);
}
for(rg int i=1;i<=n-1;++i){
// int w=read();
int w;
scanf("%d",&w);
add((i-1)*(m-1)*2+1,s,w);
add(s,(i-1)*(m-1)*2+1,w);
for(rg int j=1;j<=m-2;++j){
// w=read();
scanf("%d",&w);
add((i-1)*(m-1)*2+j*2+1,(i-1)*(m-1)*2+j*2,w);
add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2+1,w);
}
// w=read();
scanf("%d",&w);
add((i-1)*(m-1)*2+(m-2)*2+2,t,w);
add(t,(i-1)*(m-1)*2+(m-2)*2+2,w);
}
for(rg int i=1;i<=n-1;++i){
for(rg int j=1;j<=m-1;++j){
// int w=read();
int w;
scanf("%d",&w);
add((i-1)*(m-1)*2+j*2-1,(i-1)*(m-1)*2+j*2,w);
add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2-1,w);
}
}
int ans=spfa();
printf("%d",ans);
return 0;
}

【题解】狼抓兔子—BZOJ1001。的更多相关文章

  1. 狼抓兔子 BZOJ- 1001 最小割

    https://www.lydsy.com/JudgeOnline/problem.php?id=1001 一个图,问你花费多少才能把到终点的所有边堵住... 就是求一个最小割,把$(1,1)$和$( ...

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

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

  3. 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解

    [BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 18872  Solved ...

  4. 【BZOJ1001】狼抓兔子(网络流)

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

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

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

  6. 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)

    [BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...

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

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

  8. 【BZOJ1001】狼抓兔子

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

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

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

随机推荐

  1. Greedy分饼干

    分饼干:因为饼干大小和孩子的食欲度不一定是按大小顺序排列的,所以开始要排序一下,然后从最小的饼干依次从食欲小的孩子开始看,如果他愿意吃,就++,看下一个小孩子,这回拿的就是大一点的饼干了. Examp ...

  2. fastJson反序列化异常,JSONException: expect ':' at 0, actual =

    com.alibaba.fastjson.JSONException: expect , actual = at com.alibaba.fastjson.parser.DefaultJSONPars ...

  3. nginx 常见正则匹配符号表示

    1.^: 匹配字符串的开始位置: 2. $:匹配字符串的结束位置: 3..*: .匹配任意字符,*匹配数量0到正无穷: 4.\. 斜杠用来转义,\.匹配 . 特殊使用方法,记住记性了: 5.(值1|值 ...

  4. python小白——进阶之路——day2天-———数据类型和Number类型和str字符串

    ### -python的六大标准数据类型(1)Number 数字类型(int float bool complex)(2)String 字符串类型(3)List 列表类型(4)Tuple 元组类型(5 ...

  5. 最新 robot framework安装

    相信大家对robot framework并不陌生,它是一个基于Python语言,用于验收测试和验收测试驱动开发(ATDD)的通用测试自动化框架=,提供了一套特定的语法,并且有非常丰富的测试库. Pyt ...

  6. 石家庄地铁系统开发(java web版)(二)

    两种方法: 一,自己写数据库,自己写算法实现 二,调用已有软件的API(百度,高德)

  7. Tutorial 03_分布式数据库HBASE

    (一)编程实现一下内容,并用Hadoop提供的Shell命令完成相同任务: 编程实现: (1)列出HBase所有表的相关信息,例如表名; package tutorial01; import java ...

  8. 【刷题】牛客网看到的鹅厂ML面筋-部分问题RecSys相关

    昨天下午六点半的电话面试,其实我已经有了一个不错的实习offer ,不是特别想去腾讯了,没有太怎么准备,接的电话. 整个面试15分钟,开始就是自我介绍,接着问项目,和上一段百度实习经历.问题大致如下: ...

  9. promise源码解析

    前言 大部分同学对promise,可能还停留在会使用es6的promise,还没有深入学习.我们都知道promise内部通过reslove.reject来判断执行哪个函数,原型上面的then同样的,也 ...

  10. 4月22日MySQL学习

    前面学习的知识基本都是概念知识没有什么代码,然后还有图形界面来辅助学习. 今天学习了MySQL的存储引擎,最常用的两种 MYISAM:不支持事务,也不支持外键,但是访问速度快. INNODB:支持事务 ...