P4001 [BJOI2006]狼抓兔子(对偶图)
最短路+对偶图
看这题最容易想到的就是网络流。Dinic可以过,据说还跑得比正解快。
如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu)
我们把图转成对偶图。特别的,图外面的空间沿左上-右下(起点-终点)切开,作为虚拟起点/终点。
然后我们就可以愉快地跑一遍最短路了。因为对偶图中的最短路就等于平面图中的最小割。
我们可以把问题看成:左上和右下各有一个电源,现在它们短路。给出电线的价值,求如何用最小的代价剪断若干条电线(不能拆吗),让这两个电源之间没有电线直接连接。
构图?瞎搞。但是vector会MLE一个点(姿势不行TAT),所以用邻接表存边,套一个堆优化dijkstra就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cctype>
using namespace std;
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
struct data{
int d,u;
bool operator < (const data &tmp) const {return d>tmp.d;}
}; priority_queue <data> h;
int n,m,s,t,d[],cnt,hd[],nxt[],ed[],poi[],dis[];
inline void add(int x,int y,int v){
nxt[ed[x]]=++cnt; hd[x]=hd[x] ? hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y; dis[cnt]=v;
}
int main(){
read(n); read(m); int q1,q2,q3;
s=(n-)*(m-)*+; t=s+; //左上/右下为虚拟起点/终点
for(int i=;i<=n;++i)
for(int j=;j<m;++j){
q1= i<n ? (i-)*(m-)*+j:s,q2= i> ? (i-)*(m-)*+m-+j:t,read(q3); //给每个块编号
add(q1,q2,q3); add(q2,q1,q3);
}
for(int i=;i<n;++i)
for(int j=;j<=m;++j){
q1= j<m ? (i-)*(m-)*+m-+j:t,q2= j> ? (i-)*(m-)*+j-:s,read(q3);
add(q1,q2,q3); add(q2,q1,q3);
}
for(int i=;i<n;++i)
for(int j=;j<m;++j){
q1=(i-)*(m-)*+j,q2=q1+m-,read(q3);
add(q1,q2,q3); add(q2,q1,q3);
}
memset(d,,sizeof(d));
h.push((data){d[s]=,s});
while(!h.empty()){ //裸的堆优化dj
data x=h.top(); h.pop();
if(x.d!=d[x.u]) continue;
for(int i=hd[x.u];i;i=nxt[i]){
if(x.d+dis[i]<d[poi[i]]){
d[poi[i]]=x.d+dis[i];
if(poi[i]!=t) h.push((data){d[poi[i]],poi[i]});
}
}
}printf("%d",d[t]);
return ;
}
P4001 [BJOI2006]狼抓兔子(对偶图)的更多相关文章
- 洛谷P4001 [BJOI2006]狼抓兔子(平面图转对偶图)
传送门 明明只要最小割加点优化就能过的东西…… 然而我偏偏要去学平面图转对偶图结果发现课件关键地方看不清->这里 而且建图累的半死…… 说实话只要最大流建图的时候反向边直接设为当前边容量再加个当 ...
- P4001 [BJOI2006]狼抓兔子
传送门 思路: 不少题解都是用网络流来做最小割(网络流是什么),但对于一个不会网络流的蒟蒻来做这题相当困难. 听机房daolao说可以重构图做最短路.然后就baidu将平面图转换成一个对偶图,因为网络 ...
- [洛谷P4001][BJOI2006]狼抓兔子
题目大意:给你一个n*m的网格图,有三种边,横的,纵的和斜的,要你求出它的最小割 题解:网络流 卡点:1.无向图,反向弧容量应和正向弧相同 C++ Code: #include<cstdio&g ...
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
- BJOI2006狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 9967 Solved: 2267[Submit][S ...
- 【BZOJ1001】[BeiJing2006]狼抓兔子 对偶图最短路
[BZOJ1001][BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子 ...
- 752. [BJOI2006] 狼抓兔子
★★★ 输入文件:bjrabbit.in 输出文件:bjrabbit.out 简单对比时间限制:1 s 内存限制:162 MB Description Source: Beijin ...
- [BJOI2006]狼抓兔子
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- 1001. [BJOI2006]狼抓兔子【最小割】
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
随机推荐
- uploadify3.2.1 多文件上传总是只能上传一个文件
再网上找了老半天原因,有人说是上传时调用方法参数应该加上*号(:$('#mulfile_upload').uploadify('upload','*');) 总是不行, 我怀疑下面的原因: 我就以为是 ...
- Unity事件处理机制与NGUI事件机制
1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个 ...
- Kettle 4.2源码分析第四讲--KettleJob机制与Database插件简介(含讲解PPT)
1. Job机制 一个job项代表ETL控制流中的一项逻辑任务.Job项将会顺序执行,每个job项会产生一个结果,能作为别的分支上job项的条件. 图 1 job项示例 1.1. Job类图简介 图 ...
- tcpdump抓包二进制tcp协议详细分析
1.tcpdump -i eth0 port 11751 and src host 192.168.1.34 -x -s0 tcpdump: verbose output suppressed, us ...
- Common Gateway Interface Python CGI编程
https://en.wikipedia.org/wiki/Gateway_(telecommunications) In telecommunications, the term gateway r ...
- SQL语句常见视图操作部分试题(一)
创建一个名称为EMPLOYEES_VU的视图,它基于EMPLOYEES表中的雇员号.雇员名和部门号.将雇员名的列标题改为EMPLOYEE. CREATE VIEW EMPLOYEES_VU AS SE ...
- 如何下载Bilibili视频
方法1: https://www.bilibili.com/video/av25940642 (源网址) https://www.ibilibili.com/video/av25940642 (新网址 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- ifame_自适应高度
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- LINUX的前后台程序查看切换
1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行 root@Ubuntu$ ./tcpserv01 & 2.如果程序正在前台运行,可以使用 Ctrl ...