(胡扯时间)今天炒鸡无聊就打算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. Android 获取验证码倒计时实现

    Android 获取验证码倒计时实现 2017年10月24日 09:55:41 FBY展菲 阅读数:2002    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  2. (light oj 1319) Monkey Tradition 中国剩余定理(CRT)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1319 In 'MonkeyLand', there is a traditional ...

  3. C#如何使SQLite程序集既能适应32位系统也能适应64位系统

    分享5: 需求:都知道Sqlite3是分32位和64位版本的,那如果将一个Sqlite3.dll文件全适用 分析:Sqlite是种轻量级的数据库文件,使用了混合编程而成的,一部分采用非托管的C++代码 ...

  4. 手动安装Package Control

    手动下载一个package control的包:https://github.com/wbond/package_control 然后Download ZIP后,解压,将解压后的文件夹重命名为 Pac ...

  5. beanshell断言模版

    if("${createTime_1}".equals("${createTime_2}")){ Failure = false; FailureMessage ...

  6. 微信小程序域名

    微信小程序与第三方服务器通讯的域名必要条件1.一个已备案的域名,不是localhost.也不是127.0.0.1,域名不能加端口2.加ssl证书,也就是https://~~~3.HTTPS 服务器的 ...

  7. Docker 部署Confluence15.2

    一.数据库准备 数据库版本:5.7 这里数据库并没有采用docker镜像方式,而是选择已有数据库.至于数据库安装这里不再说明. 注:我这里安装confluence时,需要在下面配置数据库信息时,在数据 ...

  8. Warning: Using a password on the command line interface can be insecure.

    [root@qttc ~]# /usr/local/mysql/bin/mysqldump  -uroot -proot db > bak.sqlWarning: Using a passwor ...

  9. Java 异常体系(美团面试)

    Java把异常作为一种类,当做对象来处理.所有异常类的基类是Throwable类,两大子类分别是Error和Exception. 系统错误由Java虚拟机抛出,用Error类表示.Error类描述的是 ...

  10. c提高第四次作业

    1. 简述指针数组和数组指针的区别?答: 指针数组:是一个数组,每个元素都是指针 数组指针:是一个指针,指向数组的指针 2. 如何定义一个指向 int a[10] 类型的指针变量(数组指针)(使用3种 ...