题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2007

题解:

网络流、最小割、对偶图

奇妙的题 ~

种种原因导致了高度要么为 0,要么为 1 (1),然后 0,1区域是分离的 (2)。
对于 (2) 是显然的,因为如果在一片 1的区域中出现了一个 0,那么把 0改为 1一定会更优。
而对于 (1) ,就只有感性一点理解了(没看到一个比较理性的讲解)。
    由于左上角为 0,右下角为 1,所以总会存在有上坡路。
    那么为了使上坡导致的体力消耗最少,我们会去选择一条流量小(流量设为w)的路从 0直接爬向 1,
    这样才是最优的。
    如果此时不一次性爬上去,而是爬部分高度 h (0<h<1) 那么以后也必然会爬到 1,
    但那时流量的大小就不如之前的 w小了,所以总的消耗是大于在流量小的边一次性爬上 1的。

所以至此,求出左上角 S ->右下角 T 的最小割便是答案了。
(这条割把图分为了 0部 和 1部)

但是跑网络流会超时。
由于图的特殊性——非常规则,
所以就把中间的各个区域抽象成一个个的点,
图的左下的空白区域看成是 S点,
图的右上的空白区域看成是 T点,
然后按照("左手定则",诶呀,管的怎么建的,符合题意就可以了)一定的方向把原图的边变为与它垂直的边(边权不变),连接新的那些点,
最后跑一个更加高效的最短路算法,求出S->T的最短路就是答案了。
(可以感性理解为是在模拟去割那张图)。

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 300000
#define MAXM 3000000
#define ll long long
using namespace std;
struct Edge{
ll to[MAXM],val[MAXM],nxt[MAXM],head[MAXN],ent;
void Init(){ent=2;}//记得初始化
void Adde(ll u,ll v,ll w){
to[ent]=v; val[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
}
ll Next(ll i,bool type){
return type?head[i]:nxt[i];
}
}E;
ll dis[MAXN];
ll N;
ll idx(ll i,ll j){
return (i-1)*N+j;
}
ll Dijkstra(ll S,ll T){
typedef pair<ll,ll>pii;
static bool vis[MAXN];
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis)); ll u,v;
priority_queue<pii,vector<pii>,greater<pii> >q; q.push(make_pair(0,S)); dis[S]=0;
while(!q.empty()){
u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(ll i=E.Next(u,1);i;i=E.Next(i,0)){
v=E.to[i];
if(vis[v])continue;
if(dis[v]<=dis[u]+E.val[i]) continue;
dis[v]=dis[u]+E.val[i];
q.push(make_pair(dis[v],v));
}
}
return dis[T];
}
int main()
{
freopen("altitude.in","r",stdin);freopen("altitude.out","w",stdout);
E.Init(); ll S,T;
scanf("%lld",&N);
S=N*N+1; T=S+1;
for(ll i=1,x,from,to;i<=N+1;i++)
for(ll j=1;j<=N;j++){
scanf("%lld",&x);
from=i==N+1?S:idx(i,j);
to=i==1?T:idx(i-1,j);
E.Adde(from,to,x);
}
for(ll i=1,x,from,to;i<=N;i++)
for(ll j=1;j<=N+1;j++){
scanf("%lld",&x);
from=j==1?S:idx(i,j-1);
to=j==N+1?T:idx(i,j);
E.Adde(from,to,x);
}
for(ll i=1,x,from,to;i<=N+1;i++)
for(ll j=1;j<=N;j++){
scanf("%lld",&x);
from=i==1?T:idx(i-1,j);
to=i==N+1?S:idx(i,j);
E.Adde(from,to,x);
}
for(ll i=1,x,from,to;i<=N;i++)
for(ll j=1;j<=N+1;j++){
scanf("%lld",&x);
from=j==N+1?T:idx(i,j);
to=j==1?S:idx(i,j-1);
E.Adde(from,to,x);
}
ll ans=Dijkstra(S,T);
printf("%lld",ans);
return 0;
}

●BZOJ 2007 NOI 2010 海拔的更多相关文章

  1. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

  2. NOI 2010 海拔(最小割转最短路)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路 首先可以发现一个结论,每个位置的海拔只有能是 \(0\) 和 \(1\) ,然后 ...

  3. NOI 2010 海拔 ——平面图转对偶图

    [题目分析] 可以知道,所有的海拔是0或1 最小割转最短路,就可以啦 SPFA被卡,只能换DIJ [代码] #include <cstdio> #include <cstring&g ...

  4. ●BZOJ 2006 NOI 2010 超级钢琴

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2006 题解: RMQ + 优先队列 (+ 前缀) 记得在一两个月前,一次考试考了这个题目的简 ...

  5. [bzoj 2005][NOI 2010]能量采集(容斥原理+递推)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 分析:首先易得ans=∑gcd(x,y)*2+1 然后我就布吉岛了…… 上网搜了下题解, ...

  6. ●BZOJ 2005 NOI 2010 能量采集

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题解: 一个带有容斥思想的递推.%%% 首先,对于一个点 (x,y) 在路径 (0,0 ...

  7. bzoj 2005 NOI 2010 能量采集

    我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1 那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点 的gcd值*2-n*m,那么问题转化成了求每个点的 ...

  8. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

  9. BZOJ 2007 海拔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路: 显然海拔是一片0,另一片1,答案就是01的分界线的流量. 本题中的图是平面图,所以求最 ...

随机推荐

  1. 学号:201621123032 《Java程序设计》第9周学习总结(

    1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...

  2. 2017-2018-1 我爱学Java 第一周 作业

    构建之法 成员及分工 内容简介 作者简介 分章学习及问题 第一章 概论 第二章 个人技术和流程 第三章 软件工程师的成长 第四章 两人合作 第五章 团队和流程 第六章 敏捷流程 第七章 实战中的软件工 ...

  3. Struts2之Struts2的下载与安装

    Struts2的下载 登陆struts的官网 下载Full Distribution这个选项的struts2的包. 这是Struts2的完整版,里面包括Struts2的实例应用,空实例应用,核心库,源 ...

  4. IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费

    大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...

  5. EasyUi中对话框。

    html页面代码: <head id="Head1" runat="server"> <meta http-equiv="Conte ...

  6. Linux "零拷贝" sendfile函数中文说明及实际操作

    Sendfile函数说明 #include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); sendfile ...

  7. 浏览器端类EXCEL表格插件 - 智表ZCELL产品V1.0.0.1版本发布

    智表的优势 智表兼容与依赖 ZCELL 基于jQuery V1.11.3版本研发,兼容性依赖于jQuery自身的兼容性. 经过验证,目前IE.火狐.谷歌.360等主流浏览器均可以正常使用. 智表下载 ...

  8. 阿里云API网关(17)签名算法

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  9. Debian8搭建LEMP环境

    LEMP环境指的是Linux+Nginx+MariaDB+PHP 这里我选择的版本是最新的MariaDB和PHP7 安装Nginx 相对于Apache,Nginx是一个轻量级的高性能web服务器并在近 ...

  10. Python系列之 - 反射

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...