【题解】狼抓兔子—BZOJ1001。
(胡扯时间)今天炒鸡无聊就打算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。的更多相关文章
- 狼抓兔子 BZOJ- 1001 最小割
https://www.lydsy.com/JudgeOnline/problem.php?id=1001 一个图,问你花费多少才能把到终点的所有边堵住... 就是求一个最小割,把$(1,1)$和$( ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解
[BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 18872 Solved ...
- 【BZOJ1001】狼抓兔子(网络流)
[BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...
- 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路
[BZOJ1001][BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子 ...
- 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)
[BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- 【BZOJ1001】狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 7530 Solved: 1724[Submit][S ...
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
随机推荐
- Django学习笔记(1)--第一个项目
操作系统:Windows Python版本:python3.6 前置工作: pip install virtualenvwrapper #安装虚拟环境管理包 1.创建虚拟环境 mkvirtualenv ...
- C语言函数的格式
#include <stdio.h>#include <stdlib.h>extern int addf(int a,int b);//函数能多次声明//int addf(in ...
- Appium 服务器初始化参数(Capability)
键 描述 值 automationName 自动化测试的引擎 Appium (默认)或者 Selendroid platformName 使用的手机操作系统 iOS, Android, 或者 Fire ...
- es6中常用方法
查询数组中是否包含了某个元素keyword arr.includes(keyword)
- webpack4 学习 --- 处理静态资源
webpack 是利用loader 来处理各种资源的,wepback的配置基本上就是为各种资源文件,指定不同类型的loader. 1,处理css 最基本的css 处理loader 是css-loade ...
- DS博客作业02--线性表
1.本周学习总结 1.1思维导图 1.2.谈谈你对线性表的认识及学习体会 这阶段学习学的是线性表,学习线性表的两种存储顺序-----链表和顺序表,体会了两者存储结构之间的区别,通过对顺序表,单链表,双 ...
- SPFA求最短路——Bellman-Ford算法的优化
SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE), ...
- python高级编程和算法
import copy #a = ("a","b","c") #a = ["a","b"," ...
- Django 对接 支付宝支付, 回调
平台 点击这里进入 蚂蚁金服开放平台 沙箱 点击这里进入 沙箱环境 初始界面 设置公钥 下载创建秘钥工具 1. 进入文档中心 这里 2. 选中 电脑网站支付 3. 进入后选中 API 列表 中的 统 ...
- Sublime Text3—设置快捷键打开浏览器
在不同浏览器查看代码效果可谓是家常便饭,所以用不同快捷键对应打开不同浏览器可以大大提高工作效率. 本篇分享个简单的方法只需二步: 一.安装插件SideBarEnhancements ctrl+shif ...