(胡扯时间)今天炒鸡无聊就打算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. Linux新手随手笔记1.3

    shell脚本的编写(划重点) #!/bin/bash                    脚本的声明信息 #sjsjdhsjdhh                  脚本的注释 ls -l    ...

  2. 重大变革即将来临 5G CPE会替代光纤入户吗?

    导读 从国内的新闻报道上我们可以看到,从2018年下半年开始各大重要活动.春晚直播等,都宣布已经使用5G网络.既然支持5G网络的终端都还没有正式上市,那么5G网络是如何使用的呢?答案是5G CPE设备 ...

  3. PHP将汉字转为拼音

    没什么难度,最大的难点应该是需要有一个汉字-拼音库. <?php function spell($str, $ishead=0){ $restr = ''; $str = trim($str); ...

  4. ios 添加三方字体

    字体文件一般后缀名为.ttf 或.odf (备注: 有的字体是收费的,不能用于商业应用.所以还请设计师选择免费的字体好一点,不然会收到律师函哦) 1 加入字体文件 2. info.plist 文件引入 ...

  5. RB-Tree插入过程详解

    红黑树具有很优秀的特性,其自平衡性特性,局部调整特性使得红黑树插入,删除,以查找,以及这些过程的内存资源的占用,的综合性能是非常高的(通常我们会拿红黑树和AVL树进行对比). 对于红黑树的这些特性,在 ...

  6. Flutter路由导航Navigator

    第一点:push使用 1.pushNamed——Navigator.of(context).pushNamed('routeName'); 此种方法只是简单的将我们需要进入的页面push到栈顶,以此来 ...

  7. Making every developer more productive with Visual Studio 2019

    Today, in the Microsoft Connect(); 2018 keynote, Scott Guthrie announced the availability of Visual ...

  8. 【pytorch】pytorch-LSTM

    pytorch-LSTM() torch.nn包下实现了LSTM函数,实现LSTM层.多个LSTMcell组合起来是LSTM. LSTM自动实现了前向传播,不需要自己对序列进行迭代. LSTM的用到的 ...

  9. nginx springboot配置

    1.下载安装nginx 2.nginx.conf文件修改参数 上方是代理后的端口,代理的server.下方是需要代理的路径 3.windows 下操作指令 启动 直接点击Nginx目录下的nginx. ...

  10. NOIP算法小结(转载)

    (一)数论 1.最大公约数,最小公倍数 2.筛法求素数 3.mod规律公式 4.排列组合数,错排 5.Catalan数 6.康托展开 7.负进制 8.中位数的应用 9.位运算 (二)高精度算法 1.朴 ...