●BZOJ 2007 NOI 2010 海拔
题链:
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 海拔的更多相关文章
- [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)
[BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...
- NOI 2010 海拔(最小割转最短路)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路 首先可以发现一个结论,每个位置的海拔只有能是 \(0\) 和 \(1\) ,然后 ...
- NOI 2010 海拔 ——平面图转对偶图
[题目分析] 可以知道,所有的海拔是0或1 最小割转最短路,就可以啦 SPFA被卡,只能换DIJ [代码] #include <cstdio> #include <cstring&g ...
- ●BZOJ 2006 NOI 2010 超级钢琴
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2006 题解: RMQ + 优先队列 (+ 前缀) 记得在一两个月前,一次考试考了这个题目的简 ...
- [bzoj 2005][NOI 2010]能量采集(容斥原理+递推)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 分析:首先易得ans=∑gcd(x,y)*2+1 然后我就布吉岛了…… 上网搜了下题解, ...
- ●BZOJ 2005 NOI 2010 能量采集
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题解: 一个带有容斥思想的递推.%%% 首先,对于一个点 (x,y) 在路径 (0,0 ...
- bzoj 2005 NOI 2010 能量采集
我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1 那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点 的gcd值*2-n*m,那么问题转化成了求每个点的 ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- BZOJ 2007 海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路: 显然海拔是一片0,另一片1,答案就是01的分界线的流量. 本题中的图是平面图,所以求最 ...
随机推荐
- 冲刺NO.7
Alpha冲刺第七天 站立式会议 项目进展 前期数据库设计所遗留的问题在今天得到了部分的解决,对物资管理所需要的数据内容进行了细化,但并未开始编写物资相关模块,主要精力还是放在项目的核心功能(信用管理 ...
- iOS 简易无限滚动的图片轮播器-SDCycleScrollView
@interface ViewController () <</span>SDCycleScrollViewDelegate> @end @implementation Vie ...
- 201421123042 《Java程序设计》第7周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件源 事件对象 事件监听器 事件适合配器 1.2 ...
- Django 分类标签查找
from django.conf.urls import url from django.contrib import admin from blog.views import index,stude ...
- 使用Github pages+jekyll搭建自己的博客(windows版)
最近突发奇想,想试试GitHub pages来搭建博客.网上一搜一大堆,嗯...看来还是挺简单的...于是自己撸起袖子干...... 结果对于我这种GitHub注册过,git 没用过,ruby.jek ...
- 使用ArrayList时代码内部发生了什么(jdk1.7)?
前言 ArrayList(这里的ArrayList是基于jdk1.7)是在项目中经常使用的集合类,例如我们从数据库中查询出一组数据.这篇文章不去剖析它的继承和实现,只是让我们知道实例化及增删改查时它的 ...
- Network in Network
 论文要点: 用更有效的非线性函数逼近器(MLP,multilayer perceptron)代替 GLM 以增强局部模型的抽象能力.抽象能力指的模型中特征是对于同一概念的变体的不变形. 使用 gl ...
- Filter 和 interceptor 的区别
1. 拦截器 interceptor ● 特点:interceptor 依赖于web框架,在Spring<MV中就是依赖于springMVC框架.在实现上是基于Java的反射机制,属于面向切面编 ...
- SpringMVC源码情操陶冶#task-executor解析器
承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...
- bootstrap 一个简单的登陆页面
效果如图:用bootstrap 写的一个简单的登陆 一.修改样式 样式可以自己调整,例如换个背景色之类的,修改 background-color属性就可以 #from { background-col ...