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]狼抓兔子(对偶图)的更多相关文章

  1. 洛谷P4001 [BJOI2006]狼抓兔子(平面图转对偶图)

    传送门 明明只要最小割加点优化就能过的东西…… 然而我偏偏要去学平面图转对偶图结果发现课件关键地方看不清->这里 而且建图累的半死…… 说实话只要最大流建图的时候反向边直接设为当前边容量再加个当 ...

  2. P4001 [BJOI2006]狼抓兔子

    传送门 思路: 不少题解都是用网络流来做最小割(网络流是什么),但对于一个不会网络流的蒟蒻来做这题相当困难. 听机房daolao说可以重构图做最短路.然后就baidu将平面图转换成一个对偶图,因为网络 ...

  3. [洛谷P4001][BJOI2006]狼抓兔子

    题目大意:给你一个n*m的网格图,有三种边,横的,纵的和斜的,要你求出它的最小割 题解:网络流 卡点:1.无向图,反向弧容量应和正向弧相同 C++ Code: #include<cstdio&g ...

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

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

  5. BJOI2006狼抓兔子

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

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

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

  7. 752. [BJOI2006] 狼抓兔子

    ★★★   输入文件:bjrabbit.in   输出文件:bjrabbit.out   简单对比时间限制:1 s   内存限制:162 MB Description   Source: Beijin ...

  8. [BJOI2006]狼抓兔子

    题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  9. 1001. [BJOI2006]狼抓兔子【最小割】

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

随机推荐

  1. ubuntu16.04下安装kdevelop和汉化

    1.Kdevelop安装 最简单的命令行安装,打开终端,执行 sudo apt-get install kdevelop 2.Kdevelop汉化 不需要自己下载汉化包,Kdevelop安装后,在终端 ...

  2. H-数学考试 想法题+最新头文件 2018年长沙理工大学第十三届程序设计竞赛

    https://www.nowcoder.com/acm/contest/96/H 坑点:INF开太小了... #define _CRT_SECURE_NO_WARNINGS #include< ...

  3. PDB、PD、PMP、RTB哪个更好?为品牌主解锁程序化购买的选择技巧

    PDB.PD.PMP.RTB哪个更好?为品牌主解锁程序化购买的选择技巧 https://baijiahao.baidu.com/s?id=1620277114893208111&wfr=spi ...

  4. 获取linux工具命令源码

    总结: 通过先通过which找到命令路径path rpm -qf  path 获取源码名称n rpm -qi n   获取源码地址 [root@d mongoexport]# rpm --helpUs ...

  5. Arrow-一个最好用的日期时间Python处理库

    https://www.jianshu.com/p/c878bb1c48c1 写过Python程序的人大都知道,Python日期和时间的处理非常繁琐和麻烦,主要有以下几个问题: 有众多的package ...

  6. Google Guava缓存实现接口的限流

    一.项目背景 最近项目中需要进行接口保护,防止高并发的情况把系统搞崩,因此需要对一个查询接口进行限流,主要的目的就是限制单位时间内请求此查询的次数,例如1000次,来保护接口. 参考了 开涛的博客聊聊 ...

  7. T-SQL中的十大注意事项

    转载自:http://www.cnblogs.com/CareySon/archive/2012/10/11/2719598.html 1.在生产环境中不要出现Select * 这一点我想大家已经是比 ...

  8. 十天精通CSS3(4)

    text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...

  9. MongoDB3.x中添加用户和权限控制

    现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限.注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth) ? 1 2 3 4 5 6 7 8 9 10 ...

  10. Elasticsearch Java API—多条件查询(must)

    多条件设置 //多条件设置 MatchPhraseQueryBuilder mpq1 = QueryBuilders .matchPhraseQuery("pointid",&qu ...