题解:

首先,我们不难猜到高度只有 $0$ 或 $1$ 两种可能,而且高度为 0 的地区组成一个联通块,高度为 1 的地区组成一个联通块。只有这样,人们所耗费的体力才是最小的。
得出这个结论,题目就成了求平面图的最小割。
由于最大流等于最小割,网络流的做法是显然的,不过数据过大,不加优化是很难通过的。

我们考虑将平面图转对偶图:
我们知道平面图的最小割就等于对偶图的最短路。
本题和 bzoj1002 狼抓兔子最显著的差别就是本题的边都是有向的,而狼抓兔子的边都是无向的。
读者可以自己在草纸上画一画切割方案的 “极限” 情况,即最小割的形状是无规则的,发现对偶图中的每条边的方向恰好是原有向图的边的方向逆时针旋转 90 度。
建完图跑最短路即可。 (spfa 的话最好加一些优化)

Code:

// luogu-judger-enable-o2
#include<vector>
#include<deque>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<string>
using namespace std; typedef long long ll;
void setIO(string a){
freopen((a+".in").c_str(),"r",stdin),freopen((a+".out").c_str(),"w",stdout);
}
void end(){
fclose(stdin),fclose(stdout);
}
const int maxn=1000002;
int idx[600][600], n,s,t;
int head[maxn],to[maxn],nex[maxn],val[maxn],edges; void add_edge(int u,int v,int c){
nex[++edges]=head[u],head[u]=edges,to[edges]=v,val[edges]=c;
} long long d[maxn];
int inq[maxn];
deque<int>Q;
long long spfa()
{
memset(d,0x3f,sizeof(d));
d[s]=0,inq[s]=1;Q.push_back(s);
while(!Q.empty())
{
int u=Q.front();Q.pop_front();inq[u]=0;
for(int v=head[u];v;v=nex[v])
if(d[to[v]]>d[u]+val[v])
{
d[to[v]]=d[u]+val[v];
if(!inq[to[v]])
{
inq[to[v]]=1;
if(Q.empty()||d[Q.front()]>=d[to[v]])Q.push_front(to[v]);
else Q.push_back(to[v]);
}
}
}
return d[t];
}
int main(){
//setIO("arrangement");
scanf("%d",&n);
int cnt=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) idx[i][j]=++cnt; s=1,t=cnt+23;
int cost;
//down->up
for(int i=1;i<=n;++i) scanf("%d",&cost),add_edge(idx[1][i],t,cost);
for(int i=1;i<n;++i)
for(int j=1;j<=n;++j) scanf("%d",&cost),add_edge(idx[i+1][j],idx[i][j],cost);
for(int i=1;i<=n;++i) scanf("%d",&cost),add_edge(s,idx[n][i],cost); //left->right
for(int i=1;i<=n;++i)
{
scanf("%d",&cost),add_edge(s,idx[i][1],cost);
for(int j=1;j<n;++j)scanf("%d",&cost),add_edge(idx[i][j],idx[i][j+1],cost);
scanf("%d",&cost),add_edge(idx[i][n],t,cost);
} //up->down
for(int i=1;i<=n;++i) scanf("%d",&cost);
for(int i=1;i<n;++i)
for(int j=1;j<=n;++j)scanf("%d",&cost),add_edge(idx[i][j],idx[i+1][j],cost);
for(int i=1;i<=n;++i) scanf("%d",&cost); //right->left
for(int i=1;i<=n;++i)
{
scanf("%d",&cost);
for(int j=1;j<n;++j) scanf("%d",&cost),add_edge(idx[i][j+1],idx[i][j],cost);
scanf("%d",&cost);
}
printf("%lld",spfa());
//end();
return 0;
}

  

[NOI2010]海拔 平面图转对偶图 最小割的更多相关文章

  1. BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割

    题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...

  2. P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)

    $ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...

  3. BZOJ1001 狼抓兔子 平面图转对偶图 最小割

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

  4. [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)

    题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...

  5. Vijos1734 NOI2010 海拔 平面图最小割

    建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...

  6. Luogu2046 NOI2010 海拔 平面图、最小割、最短路

    传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...

  7. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

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

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

  9. 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子

    http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html #include<cstdio> #include<queue&g ...

随机推荐

  1. ARIMA模型实例讲解——网络流量预测可以使用啊

    ARIMA模型实例讲解:时间序列预测需要多少历史数据? from:https://www.leiphone.com/news/201704/6zgOPEjmlvMpfvaB.html   雷锋网按:本 ...

  2. hadoop 2.6.0 分布式 + Spark 1.1.0 集群环境

    配置jdk 执行 sudo apt-get install openjdk-7-jdk jdk被安装到了 /usr/lib/jvm/ 目录 配置hosts 使用 vim 打开 /etc/hosts, ...

  3. HTML基础——网站信息显示页面

    1.语法和规范 HTML文件都是以.html或者.htm结尾的.建议使用.html结尾. HTML文件分为头部分(<head></head>)和体部分(<body> ...

  4. hiho1116 - 数据结构 线段树(区间合并)

    题目链接 现在有一个有n个元素的数组a1, a2, ..., an. 记f(i, j) = ai * ai+1 * ... * aj. 初始时,a1 = a2 = ... = an = 0,每次我会修 ...

  5. shell-3.bash的基本功能:通配符和其他特殊字符

    1. 2.

  6. ActiveMQ学习笔记(6)----ActiveMQ整合Spring开发

    1. 添加依赖 spring 提供了对JMS的支持,需要添加Spring支持jms的包和Spring的核心包,如下: <dependency> <groupId>org.apa ...

  7. CTSC2012 熟悉的文章 广义后缀自动机_单调队列

    没啥难的,主要是单调队列忘了咋求了QAQ... Code: #include <cstdio> #include <algorithm> #include <cstrin ...

  8. NodeJS学习笔记 (9)网络服务-https(ok)

    模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严峻的今天,网站采用HTTPS是个必然的趋势. 在nodejs中,提供了 https 这个模块来完成 HTTPS 相关功能.从官方文档来看 ...

  9. Qt之滚动字幕

    简述 滚动字幕,也就是传说中的跑马灯效果. ​简单地理解就是:每隔一段时间(一般几百毫秒效果较佳)显示的文字进行变化(即滚动效果). 简述 实现 效果 源码 实现 利用定时器QTimer,在固定的时间 ...

  10. Oracle中set serveroutput on介绍

    定义 set serveroutpu on是使oracle可以使用自带的输出方法 dbms_output.put_line('XX'); 使用范围 使用于PL/SQL COMMAND WINDOW,S ...