题链:

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. 冲刺NO.7

    Alpha冲刺第七天 站立式会议 项目进展 前期数据库设计所遗留的问题在今天得到了部分的解决,对物资管理所需要的数据内容进行了细化,但并未开始编写物资相关模块,主要精力还是放在项目的核心功能(信用管理 ...

  2. iOS 简易无限滚动的图片轮播器-SDCycleScrollView

    @interface ViewController () <</span>SDCycleScrollViewDelegate> @end @implementation Vie ...

  3. 201421123042 《Java程序设计》第7周学习总结

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件源 事件对象 事件监听器 事件适合配器 1.2 ...

  4. Django 分类标签查找

    from django.conf.urls import url from django.contrib import admin from blog.views import index,stude ...

  5. 使用Github pages+jekyll搭建自己的博客(windows版)

    最近突发奇想,想试试GitHub pages来搭建博客.网上一搜一大堆,嗯...看来还是挺简单的...于是自己撸起袖子干...... 结果对于我这种GitHub注册过,git 没用过,ruby.jek ...

  6. 使用ArrayList时代码内部发生了什么(jdk1.7)?

    前言 ArrayList(这里的ArrayList是基于jdk1.7)是在项目中经常使用的集合类,例如我们从数据库中查询出一组数据.这篇文章不去剖析它的继承和实现,只是让我们知道实例化及增删改查时它的 ...

  7. Network in Network

     论文要点: 用更有效的非线性函数逼近器(MLP,multilayer perceptron)代替 GLM 以增强局部模型的抽象能力.抽象能力指的模型中特征是对于同一概念的变体的不变形. 使用 gl ...

  8. Filter 和 interceptor 的区别

    1. 拦截器 interceptor ● 特点:interceptor 依赖于web框架,在Spring<MV中就是依赖于springMVC框架.在实现上是基于Java的反射机制,属于面向切面编 ...

  9. SpringMVC源码情操陶冶#task-executor解析器

    承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...

  10. bootstrap 一个简单的登陆页面

    效果如图:用bootstrap 写的一个简单的登陆 一.修改样式 样式可以自己调整,例如换个背景色之类的,修改 background-color属性就可以 #from { background-col ...