[NOI2010]海拔 平面图转对偶图 最小割
题解:
首先,我们不难猜到高度只有 $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]海拔 平面图转对偶图 最小割的更多相关文章
- BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...
- P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)
$ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...
- BZOJ1001 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
- [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)
题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...
- Vijos1734 NOI2010 海拔 平面图最小割
建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...
- Luogu2046 NOI2010 海拔 平面图、最小割、最短路
传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...
- 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...
- NOI 2010 海拔 ——平面图转对偶图
[题目分析] 可以知道,所有的海拔是0或1 最小割转最短路,就可以啦 SPFA被卡,只能换DIJ [代码] #include <cstdio> #include <cstring&g ...
- 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子
http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html #include<cstdio> #include<queue&g ...
随机推荐
- [JZOJ NOIP2018模拟10.21]
考试之前我刚刚领略到了特判的重要性,没想到T2的两个子任务还是写挂了,丢了20分 考试的感觉不行,一路打的都是暴力,正解的思路想到一半就断了推不下去 T1:逛公园 题目链接: https://jzoj ...
- (转载)Android:学习AIDL,这一篇文章就够了(上)
前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...
- Debian/Linux 下无线网卡驱动的安装
我的 PC 型号是 Acer V3-572G, 安装了 Debian 后, 发现只能通过有线网络上网, 无法识别无线网卡, 以下是解决的过程(不局限于此型号 PC): 在命令行键入 lspci , 得 ...
- javascript中的正则示例
// 方式一var obj_re = new RegExp("\d+","gi"); //g 全局,i 不区分大小写obj_re.test("fasf ...
- SQL 自动记录存储过程,表,函数的创建修改和删除 -相当于SVN一样
在项目开发过程中,项目管理者通常都很希望对项目的开发进展有一个日志的记录.代码的记录和管理可以通过TFS或者VSS等工具去管理.但是数据库却没有记录开发日志这一功能.这在实际开发中很不方便, ...
- vue 所有的路由跳转加一个统一参数
需求是什么 所有的路由跳转加一个统一的参数 实现方式 先深入理解一下router的全局前置守卫 router.beforeEach((to, from, next) => { const que ...
- css兼容性问题总结
DIV+CSS设计IE6.IE7.FF 兼容性 DIV+CSS网页布局这是一种趋势,我也开始顺应这股趋势了,不过在使用DIV+CSS网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使 ...
- (52)KeyError错误
当出现:22KeyError: 'xxxxxx'这样的错误,可以肯定依赖出问题了,一般是你引用某个字段,但没有定义,又没有指定依赖的模块,最后找不到对应字段 解决方法:开发工具,把 xxxxxx 去搜 ...
- Object-C,对象和方法
学习Object-C,买了2本书,其中1本是用C币买的,总体质量一般,比较基础. 另外一本是,疯狂-李阳写的,大部头,比较吓人,比较全一点. 对于面向对象,之前还是有个大概的理解,再多点基础的例子. ...
- securefx连接linux后文件夹中文乱码问题解决
首先在选项中设置字符编码为UTF-8 然后在全局选项中找到Securefx的配置文件 进入到该目录中,选择“Sessions”: 在“Sessions”中找到链接地址的ini文件,并用文本编辑器打开: ...