题解 洛谷 P2046 【[NOI2010]海拔】
首先进行贪心,发现海拔有梯度时一定是不优的,最优的情况是海拔像断崖一样上升,也就是左上角有一片海拔高度为\(0\),右下角有一片海拔高度为\(1\)。
发现这样的性质后,不难想到用最小割来解决问题,但数据规模过大,需要进行优化。
考虑到网格图是特殊的平面图,那么我们就将平面图转化为对偶图,通过对偶图求最短路来求平面图的最小割。
下面分析如何转化为对偶图:
我的做法是先\(n++\),使\(n×n\)个区域转化为\(n×n\)个点。
一个区域用其左上角点的坐标来表示。(图中的红点)
平面图中的有向边顺时针旋转\(90°\)后作为对偶图中的边,例如当原图的有向边为自西向东(从左到右)时,连边情况应为:
黄色箭头表示原平面图中的边,蓝色箭头表示对偶图中的边,其他三种情况同理。
建完对偶图后,从\(S\)到\(T\)的最短路即为答案。
实现细节就看代码吧
\(code:\)
#include<bits/stdc++.h>
#define maxn 1200000
#define inf 2000000000
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag) x=-x;
}
int n,s,t;
struct edge
{
int to,nxt,v;
}e[maxn];
int head[maxn],edge_cnt;
void add(int from,int to,int val)
{
e[++edge_cnt]=(edge){to,head[from],val};
head[from]=edge_cnt;
}
int num(int x,int y)
{
return y+(x-1)*n;
}
struct node
{
int val,num;
friend bool operator <(const node &x,const node &y)
{
return x.val>y.val;
}
};
priority_queue<node> q;
int dis[maxn];
bool vis[maxn];
void dijkstra()
{
for(int i=s;i<=t;++i) dis[i]=inf;
dis[s]=0;
q.push((node){0,s});
while(!q.empty())
{
node tmp=q.top();
q.pop();
int x=tmp.num;
if(vis[x]) continue;
vis[x]=true;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to,v=e[i].v;
if(dis[y]>dis[x]+v)
{
dis[y]=dis[x]+v;
q.push((node){dis[y],y});
}
}
}
}
int main()
{
read(n),n++;
t=n*n+1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<n;++j)
{
int val;
read(val);
if(i==1) add(s,num(i,j),val);
else if(i==n) add(num(i-1,j),t,val);
else add(num(i-1,j),num(i,j),val);
}
}
for(int i=1;i<n;++i)
{
for(int j=1;j<=n;++j)
{
int val;
read(val);
if(j==1) add(num(i,j),t,val);
else if(j==n) add(s,num(i,j-1),val);
else add(num(i,j),num(i,j-1),val);
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<n;++j)
{
int val;
read(val);
if(i==1) add(num(i,j),s,val);
else if(i==n) add(t,num(i-1,j),val);
else add(num(i,j),num(i-1,j),val);
}
}
for(int i=1;i<n;++i)
{
for(int j=1;j<=n;++j)
{
int val;
read(val);
if(j==1) add(t,num(i,j),val);
else if(j==n) add(num(i,j-1),s,val);
else add(num(i,j-1),num(i,j),val);
}
}
dijkstra();
printf("%d",dis[t]);
return 0;
}
题解 洛谷 P2046 【[NOI2010]海拔】的更多相关文章
- 洛谷$P2046\ [NOI2010]$海拔 网络流+对偶图
正解:网络流+对偶图 解题报告: 传送门$QwQ$ $umm$之前省选前集训的时候叶佬考过?然而这和我依然不会做有什么关系呢$kk$ 昂这题首先要两个结论?第一个是说每个位置的海拔一定是0/1,还一个 ...
- 洛谷P2046 [NOI2010]海拔(最小割,平面图转对偶图)
传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为 ...
- 洛谷2046 NOI2010海拔
QwQ题目太长 这里就不复制了 题目 这个题...算是个比较经典的平面图最小割变成对偶图的最短路了QwQ 首先考虑最小割应该怎么做. 有一个性质,就是每个点的海拔要么是1,要么是0 QwQ不过这个我不 ...
- 洛谷 P2046 BZOJ 2007 海拔(NOI2010)
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...
- [洛谷P2048] [NOI2010] 超级钢琴
洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...
- 洛谷P1447 - [NOI2010]能量采集
Portal Description 给出\(n,m(n,m\leq10^5),\)计算\[ \sum_{i=1}^n \sum_{j=1}^m (2gcd(i,j)-1)\] Solution 简单 ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
随机推荐
- Java容器:HashMap连环炮
本文来源于:https://mp.weixin.qq.com/s/oRx-8XXbgage9Hf97WrDQQ, 公众号:安琪拉的博客 前言 HashMap应该算是Java后端工程师面试的必问题,因为 ...
- django 分页器,序列化 ,MTV MVC
序列化组件## from django.core import serializers # django自带的一个小型的序列化工具# def reg(request):# user_list = mo ...
- SQL注入之MySQL常用的查询语句
MySQL是一种使用很广的数据库,大部分网站都是用MySQL,所以熟悉对MySQL数据库的注入很重要. 首先来说下MySQL注入的相关知识点 在MySQL5.0版本之后,MySQL默认在数据库存放一个 ...
- python fabric安装
1 安装epel wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 2 安装pip yum i ...
- 栈的顺序存储和链式存储c语言实现
一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...
- hibernate快速入门示例
hibernate概述 hibernate是一个java的全自动ORM框架,它可以自动生成SQL语句.自动建表.自动执行,使用者可以不使用SQL完成数据的CRUD操作,同时它也是基于JPA规则的一种实 ...
- 2020年,web前端还好找工作吗?
好不好找是个相对概念,如果你要跟几年前相比,那么一定是「相对不好找」.原因所学的知识过时 用 Vue 模仿一个饿了么就能找工作的时代一去不复返. 但是为什么现在一堆大厂喊着招聘难呢? 那是因为候选人技 ...
- 聊聊Java中的异常及处理
前言 在编程中异常报错是不可避免的.特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时.今天就让我们来看看什么是异常和怎么合理的处理异常吧! 异常与error介绍 ...
- Java1.7的HashMap源码分析-面试必备技能
HashMap是现在用的最多的map,HashMap的源码可以说是面试必备技能,今天我们试着分析一下jdk1.7下的源码. 先说结论:数组加链表 一.先看整体的数据结构 首先我们注意到数据是存放在一个 ...
- 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译
源码学习第一步,Spring源码编译 之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就 ...